[問題] 串列傳輸接收完整資料疑問!

作者: 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