十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
不知道你是不是用51單片機往串口發(fā)數(shù)據(jù),是的話那是因為51的sbuf最多存放8個字節(jié),所以你發(fā)12個字節(jié)會分成兩次發(fā)完。還有在接收的時候最好定義好通信協(xié)議,比如加一個偵頭,一個偵尾,通過這兩個字節(jié)的內(nèi)容來接收數(shù)據(jù)。
專業(yè)領域包括成都網(wǎng)站建設、網(wǎng)站制作、成都做商城網(wǎng)站、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結合了幫做網(wǎng)絡品牌建設經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
老兄,提問還是給點懸賞分嘛,不要吝嗇哪點分,知識是無價的,你給得越多,回答你的人才會越多。
上面的代碼看不出問題,如果初始化串口控件時已經(jīng)注冊了AxMSComm1_OnComm,有數(shù)據(jù)接收應該能觸發(fā),至于為什么沒有觸發(fā),要看看你的接收方是否已經(jīng)收到你的發(fā)出指令,是否已經(jīng)有響應數(shù)據(jù)回發(fā)。
建議分開調(diào)試,用一個通用的串口助手,如格西烽火串口助手之類的,分別調(diào)試你的上位機和下位機。格西烽火串口助手能輕松的定制如你上面的發(fā)送數(shù)據(jù)。
首先:
textbox里沒有顯示,是因為SerialPort1和TextBox2不是同一線程創(chuàng)建的,需要跨線程操作。需要用到委托,這樣才能顯示出來。
其次:
我覺得用串口的接收數(shù)據(jù)事件更好一些。
下面代碼供參考:
'----------------------
'串口接收數(shù)據(jù)事件,其實比用定時器更好,
'觸發(fā)事件的條件可以自己在form_load中設置ReceivedBytesThreshold屬性數(shù)值,默認為ReceivedBytesThreshold=1
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim strRecvData As String = ""
strRecvData = SerialPort1.ReadExisting
Call disPlayComData(strRecvData)
End Sub
Delegate Sub callback(ByVal strT As String) '定義委托
Sub showString(ByVal comdata As String) '顯示結果
Me.TextBox1.Text = "結果:" comdata
End Sub
Sub disPlayComData(ByVal strTmp As String) '判定是否為跨線程
If Me.TextBox1.InvokeRequired Then
Dim d As New callback(AddressOf showString)
Me.Invoke(d, New Object() {strTmp})
Else
Me.TextBox1.Text = strTmp
End If
End Sub
不是很明白你的題意
strHex = strHex + [String].Format("{0:X2} "
這里的意思是把每個字節(jié)數(shù)據(jù)轉換成了十六進制,每個字節(jié)占兩個字符
如果你串口收到的4個字節(jié)數(shù)據(jù):43,27,56,200
那么你的結果是:2B1B38C8
即receivebytes.Text="2B1B38C8"
不足兩位的補0
如果你串口收到的4個字節(jié)數(shù)據(jù):3,27,56,200
那么你的結果是:031B38C8
即receivebytes.Text="031B38C8"
Imports System
Imports System.IO.Ports
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'獲取計算機有效串口
Dim ports As String() = SerialPort.GetPortNames() '必須用命名空間,用SerialPort,獲取計算機的有效串口
Dim port As String
For Each port In ports
portnamebox.Items.Add(port) '向combobox中添加項
Next port
'初始化界面