读书人

VB接受上位机的数据第一次总是少一位

发布时间: 2012-10-23 12:12:22 作者: rapoo

VB接受下位机的数据,第一次总是少一位
下位机给上位机串口发数据:发送多次每次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 = 1Private 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 SelectEnd 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

计算机没串口,没实验


读书人网 >VB

热点推荐