VB接受上位机的数据,第一次总是少一位
VB接受下位机的数据,第一次总是少一位
下位机给上位机串口发数据:发送多次每次15个字节
第一次发送,上位机只能收到14个,第二次发送,上位机就会收到第一次发送的最后一个数据,但是能收到15个,最后一个还是收不到
我用串口工具测试,能完整收到下位机发送的数据比如:我发送1-15的数据
第一次上位机只能收到1-14
第二次在发送,上位机能收到 15 1 2 。。。14
希望高手解答,万分感谢!!!!!!
VB串口初始化:
串口初始化:
希望哪位高手指点,万分感谢
急需呀
------解决方案--------------------
你认为一个数据帧是15位,但是InByte() = MSComm1.Input不能保证这个时候输入缓冲区是15位。
即使输入缓冲区里面只有一个数据也会产生oncomm事件。实际可能是,输入缓冲区已经有一个数据了,产生了oncomm事件,你的程序开始读取数据,在读取的时候读取的数据还没有够到15个。
以前做一个程序,我是先把缓冲区的数据放在自己的缓冲区,自己的缓冲区超过15个数据才开始自己处理数据,并把处理的数据移出缓冲区。
要是每个数据帧都是15位,那应该等够15位了再处理。
------解决方案--------------------
你已经设置MSComm1.RThreshold = 1,那么每接收一个字节就会产生oncomm事件。
InBufferCount属性返回缓冲区内的未处理数据
所以在 Case comEvReceive '接收到字符 后面添加
if mscomm1.InBufferCount<16 then exit sub
计算机没串口,没实验
下位机给上位机串口发数据:发送多次每次15个字节
第一次发送,上位机只能收到14个,第二次发送,上位机就会收到第一次发送的最后一个数据,但是能收到15个,最后一个还是收不到
我用串口工具测试,能完整收到下位机发送的数据比如:我发送1-15的数据
第一次上位机只能收到1-14
第二次在发送,上位机能收到 15 1 2 。。。14
希望高手解答,万分感谢!!!!!!
VB串口初始化:
- VB code
MSComm1.Settings = "9600,N,8,1" MSComm1.PortOpen = True MSComm1.RThreshold = 1 Private Sub MSComm1_OnComm() Dim j As Integer Dim lennow As Integer Dim InByte() As Byte '存储数据的缓冲区'定义一个二进制指针放接收到的数据 Select Case MSComm1.CommEvent '选择事件 Case comEvReceive '接收到字符 'Timer4.Enabled = False InByte() = MSComm1.Input '数据转移到指针 lennow = UBound(InByte) + 1 If lennow > 0 Then For j = 0 To lennow - 1 'recdata(lencount + j) = InByte(j) recdata(j) = InByte(j) Text1.Text = Text1.Text & recdata(j) Next j 'lencount = lencount + lennow End If j = 0 If lennow = 15 Then If recdata(2) = &HE1 Then For j = 0 To 3 If PicCD(j).Visible = False Then TIRec(j) = recdata(0) Exit For End If Next If j > 3 Then MsgBox "最多同时操作4股道!" Call SendData(recdata(0), &H55) End If End If For j = 0 To 3 If TIRec(j) = recdata(0) Then Call DataAnalysis(recdata, j) Exit For End If Next 'lencount = 0 lennow = 0 'Timer4.Enabled = True End If Case comEventRxOver '接收缓冲区满的处理 MsgBox "接收缓冲区满了!" '发出警告 End Select End Sub
串口初始化:
- C/C++ code
void serial_scon_receive() { TR1=0 ; TCON=0xC0 ; SCON=0x50 ; TMOD=0x20; TH1=0xfd ; TL1=0xfd ; //FD:9.6K; FA:4.8K; F4:2.4K PCON=0x00 ; ES=1 ; //串口中断使能 PS=1 ; EA=1 ; TR1=1 ; } 下位机串口发送: for(i=0; i<15; i++) { TR1 = 1; uart_r = 0; SBUF = pBuf[i]; while(uart_r==0) { _nop_();; } }
希望哪位高手指点,万分感谢
急需呀
------解决方案--------------------
你认为一个数据帧是15位,但是InByte() = MSComm1.Input不能保证这个时候输入缓冲区是15位。
即使输入缓冲区里面只有一个数据也会产生oncomm事件。实际可能是,输入缓冲区已经有一个数据了,产生了oncomm事件,你的程序开始读取数据,在读取的时候读取的数据还没有够到15个。
以前做一个程序,我是先把缓冲区的数据放在自己的缓冲区,自己的缓冲区超过15个数据才开始自己处理数据,并把处理的数据移出缓冲区。
要是每个数据帧都是15位,那应该等够15位了再处理。
------解决方案--------------------
你已经设置MSComm1.RThreshold = 1,那么每接收一个字节就会产生oncomm事件。
InBufferCount属性返回缓冲区内的未处理数据
所以在 Case comEvReceive '接收到字符 后面添加
if mscomm1.InBufferCount<16 then exit sub
计算机没串口,没实验