[问题] 串行传输接收完整资料疑问!

楼主: james999 (无伤大雅)   2018-03-21 13:57:18
目前在弄串行传输的程式,
当送命令格式给设备时,设备会回应。
传送7个bytes命令格式时,只有第一次会收到完整的7个bytes的回应,
但是接下来传送时,有时会收到拆成两次的回应,
请问该如何解决呢? 谢谢。
目前是先用网上找的范例程式来测试,
http://www.haolizi.net/example/view_9841.html
void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (sp1.IsOpen) //此处可能没有必要判断是否打开串口,但为了严谨性,我还
是加上了
{
//输出当前时间
DateTime dt = DateTime.Now;
txtReceive.Text += dt.GetDateTimeFormats('f')[0].ToString() + "\r\n";
txtReceive.SelectAll();
txtReceive.SelectionColor = Color.Blue; //改变字体的颜色
byte[] byteRead = new byte[sp1.BytesToRead]; //BytesToRead:sp1接收
的字符个数
if (rdSendStr.Checked) //'发送字符串'单选按钮
{
txtReceive.Text += sp1.ReadLine() + "\r\n"; //注意:回车换行必须这
样写,单独使用"\r"和"\n"都不会有效果
sp1.DiscardInBuffer(); //清空SerialPort控件的
Buffer
}
else //'发送16进制按钮'
{
try
{
Byte[] receivedData = new Byte[sp1.BytesToRead]; //创建
接收字节数组
sp1.Read(receivedData, 0, receivedData.Length); //读取
数据
//string text = sp1.Read();
//Encoding.ASCII.GetString(receivedData);
sp1.DiscardInBuffer(); //清空
SerialPort控件的Buffer
//这是用以显示字符串
// string strRcv = null;
// for (int i = 0; i < receivedData.Length; i++ )
// {
// strRcv += ((char)Convert.ToInt32(receivedData[i])) ;
// }
// txtReceive.Text += strRcv + "\r\n"; //显示信

//}
string strRcv = null;
//int decNum = 0;//存储十进制
for (int i = 0; i < receivedData.Length; i++) //窗体显示
{
strRcv += receivedData[i].ToString("X2"); //16进制显示
}
txtReceive.Text += strRcv + "\r\n";
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "出错提示");
txtSend.Text = "";
}
}
}
else
{
MessageBox.Show("请打开某个串口", "错误提示");
}
}
作者: niklee29 (就是爱喝茶)   2018-03-21 15:39:00
送过来的字串请设定结束码(如\r),接受方面以累进塞入容器里,另外写函数来判断结束码的搜寻与撷取,再将撷取到的字串从容器里删除(先进先出),就可以达成
作者: DeathTemp (邦迪亚的小金鱼)   2018-03-26 06:37:00
不然就是送过来的字串里加上这次传输的长度多少

Links booklink

Contact Us: admin [ a t ] ucptt.com