问题描述
之前发过一次贴,简单测试以为可以了,实际还是不行。具体要求如下:使用serialport类接收串口数据(串口数据是由与计算机相连的一台仪表以固定格式连续发送的),现在接收数据已正常,但是不知怎样判断串口数据已中断。(此处我所说的串口数据中断,是指由于串口rs232连接线路中断,或与计算机连接的仪表已关闭停止向计算机发送数据)。之前发帖求助,得到的用serialPort.BytesToRead=0得到缓冲字节长度,只能在serialPort打开时判断有效,如果起初接收正常,突然中断了串口的数据传输,用这个方法依旧不能得到正确结果。
解决方案
解决方案二:
if(serialPort.BytesToRead==0)
解决方案三:
将上面的语句放在serialPort1_DataReceived事件当中,
解决方案四:
privatevoidserialPort1_DataReceived(objectsender,SerialDataReceivedEventArgse){byter_byte;while(serialPort1.BytesToRead!=0){r_byte=Convert.ToByte(serialPort1.ReadByte());switch(r_flag){case0:if(r_byte==0xaa){r_flag+=1;serial_input[0]=r_byte;}break;case1:if(r_byte==0xaa){r_flag+=1;serial_input[1]=r_byte;r_count=0;}else{r_flag=0;r_count=0;}break;case2:serial_input[r_count+2]=r_byte;r_count+=1;if(serial_input[2]!=0xd0){if(r_count==4){r_flag=0;r_count=0;rs_cl();//调用接收处理函数}}else{if(r_count==0x14){r_flag=0;r_count=0;rs_cl();//调用接收处理函数}}break;}}}
解决方案五:
学习
解决方案六:
引用1楼baihe_591的回复:
if(serialPort.BytesToRead==0)
这个方法我用了,代码如下:在serialPort_DataReceived事件中:try{if(czSerialPort.BytesToRead==0){strczData="Error";}else{//定义接收数据长度intbytesRead=czSerialPort.BytesToRead;bytefirstbyte=Convert.ToByte(czSerialPort.ReadByte());//判断第一个字节是否是起始位:16进制的0x02if(firstbyte==0x02){byte[]bytesData=newbyte[bytesRead];for(inti=0;i<=bytesRead-2;i++){bytebyteData=Convert.ToByte(czSerialPort.ReadByte());//判断数据结束字节if(byteData==0x03)continue;bytesData[i]=byteData;}//将字节数组转换成字符串strczData=System.Text.Encoding.Default.GetString(bytesData);//截取数据(舍去校验和等字符)strczData=strczData.Remove(7);//通过捕获异常来转换接收到的字符串try{intintczData=Convert.ToInt32(strczData);strczData=Convert.ToString(intczData);}catch{strczData="Error";}}}catch(exectionczerror){MessageBox.Show(czerror.Message);}在代码中加入了你说的判断仍旧不行。
解决方案七:
实时检查连接标志位,异常断开时就读取数据,这样行吗
解决方案八:
你可以可以用API写,这样就有延时参数可以用了
解决方案九:
晕老在这个问题你还没解决??做个标记明天给你个点代码。
解决方案十:
SERIALPORT_DATARECEIVED怎么触发啊,我的每次都不执行啊?
解决方案十一:
mark,明天过来学习代码
解决方案十二:
好
解决方案十三:
引用8楼showjancn的回复:
晕老在这个问题你还没解决??做个标记明天给你个点代码。
是不是忘了啊,代码呢?问题还没有解决