作者james999 (无伤大雅)
看板C_Sharp
标题[问题] 串列传输接收完整资料疑问!
时间Wed Mar 21 13:57:18 2018
目前在弄串列传输的程式,
当送命令格式给设备时,设备会回应。
传送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("请打开某个串口", "错误提示");
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.132.128.217
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1521611841.A.EF5.html
1F:→ niklee29: 送过来的字串请设定结束码(如\r),接受方面以累进塞入 03/21 15:39
2F:→ niklee29: 容器里,另外写函数来判断结束码的搜寻与撷取,再将撷 03/21 15:39
3F:→ niklee29: 取到的字串从容器里删除(先进先出),就可以达成 03/21 15:39
4F:推 DeathTemp: 不然就是送过来的字串里加上这次传输的长度多少 03/26 06:37