c# 如何实现串口通信读取数据

xiaoqiu1234 2010-12-10 10:13:04
用c#实现串口通信读取数据时只读前8位
byte[] TxData1 = new byte[] { };
n = sp.BytesToRead;
byte[] TxData = new byte[n];//声明一个临时数组存储当前来的串口数据
sp.Read(TxData, 0, n); //读取缓冲数据
Array.Resize(ref TxData1, TxData1.Length + n);//改写数组大小
TxData.CopyTo(TxData1, TxData1.Length - TxData.Length);//复制
我想实现读取完整怎么办 例如:我应该接收11位数据,它只读了前8位,余下的3位怎么读。麻烦各位帮忙一下。
...全文
897 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fisher_ch 2010-12-10
  • 打赏
  • 举报
回复
楼主,对于datareceived事件,只要串口来数据了,该事件就会被触发,而且对于串口的一次发送来说,它的接收可能被分为多次完成,比如你发了一次12字节的数据,它可能会3次触发datareceived事件,才接收完12字节,所以你在datareceived事件里,应该有个拼帧的处理,看是否接收到了完整帧
xiaoqiu1234 2010-12-10
  • 打赏
  • 举报
回复
fisher_ch能说的详细一点吗 我知道要在这里设置 我用的延时的方法 也能实现 但这样做不是很合理
fisher_ch 2010-12-10
  • 打赏
  • 举报
回复
建议在datareceived事件里处理
xiaoqiu1234 2010-12-10
  • 打赏
  • 举报
回复
解决了 这样可以解决 需要的可以参考一下
int n = sp.BytesToRead;
byte[] TxData = new byte[n];
sp.Read(TxData, 0, n);
m = m + n;
this.Invoke((EventHandler)
(delegate
{

Array.Resize(ref TxData2, m);
TxData.CopyTo(TxData2, m - TxData.Length);
if (m == p)
{
byte[] data = new byte[p-2];
for (int i = 0; i < TxData2.Length -2;i++ )

{
data[i]=TxData2[i];
}
byte[] data2 = new byte[2];
data2[0] = TxData2[TxData2.Length - 2];
data2[1] = TxData2[TxData2.Length - 1];
byte[] data1 = new byte[2];
data1 = CRC16_C(data);
if (data1[0] == data2[1] && data1[1] == data2[0])
{
for (int j = 3; j <= m - 4; j = j + 2)
{
string s1 = TxData2[j].ToString();
string s2 = TxData2[j + 1].ToString();
string s = s1 + s2;
int g = Convert.ToInt32(s, 10);
string h = g.ToString();
textBox1.Text += h + " ";
}
textBox7.Text = "读取成功";
}
else
{
textBox7.Text ="读取失败";
}
m = 0;
}

}
)
);

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧