C# serialport类编写串口通信程序,无法接收全部数据! 15
C#serialport类编写串口通信程序,无法接收全部数据!通信指令发出之后,收到9个字节,而正确返回的字节数应该有59个字节。一开始我怀疑是下位机的问题,可是我用串口...
C# serialport类编写串口通信程序,无法接收全部数据!通信指令发出之后,收到9个字节,而正确返回的字节数应该有59个字节。一开始我怀疑是下位机的问题,可是我用串口精灵调试的时候可以收到59个字节,所以我肯定是我程序的问题!求大神指教!!!图片是我向串口精灵的作者的提问,请大家帮我想想办法。 下面是serialport初始化:
cbbCOMPorts.Enabled = false;
serialPort.PortName = cbbCOMPorts.Text;
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Encoding = Encoding.Unicode;
serialPort.Encoding = System.Text.Encoding.Unicode;
serialPort.Open();
这个是发出指令
private void btn_xunjian_Click(object sender, EventArgs e)//巡检
{
try
{
btn_xunjian.Enabled = false;
Byte[] BSendTemp = { 0x00, 0x00, 0xff, 0xff, 0xcc, 0x01, 0x01, 0x02, 0x40, 0x00, 0x44 }; //通信指令
serialPort.Write(BSendTemp, 0, 11);//发送命令数据
Thread.Sleep(1000);
btn_xunjian.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
下面是接受字节的程序
int bytesToRead =serialPort.BytesToRead;
byte[] BRecieve = new byte[bytesToRead];
int bytesRead = 0;
bytesRead = serialPort.Read(BRecieve, 0, bytesToRead);
//读取
string str = ByteArrayToHexString(BRecieve);
txtDataReceived.AppendText(str+Environment.NewLine);
txtDataReceived.ScrollToCaret();
请高手帮我看看
这个是图片,静待佳音 展开
cbbCOMPorts.Enabled = false;
serialPort.PortName = cbbCOMPorts.Text;
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Encoding = Encoding.Unicode;
serialPort.Encoding = System.Text.Encoding.Unicode;
serialPort.Open();
这个是发出指令
private void btn_xunjian_Click(object sender, EventArgs e)//巡检
{
try
{
btn_xunjian.Enabled = false;
Byte[] BSendTemp = { 0x00, 0x00, 0xff, 0xff, 0xcc, 0x01, 0x01, 0x02, 0x40, 0x00, 0x44 }; //通信指令
serialPort.Write(BSendTemp, 0, 11);//发送命令数据
Thread.Sleep(1000);
btn_xunjian.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
下面是接受字节的程序
int bytesToRead =serialPort.BytesToRead;
byte[] BRecieve = new byte[bytesToRead];
int bytesRead = 0;
bytesRead = serialPort.Read(BRecieve, 0, bytesToRead);
//读取
string str = ByteArrayToHexString(BRecieve);
txtDataReceived.AppendText(str+Environment.NewLine);
txtDataReceived.ScrollToCaret();
请高手帮我看看
这个是图片,静待佳音 展开
4个回答
展开全部
问题应该是出在这句:
bytesRead = serialPort.Read(BRecieve, 0, bytesToRead);
楼上的说法有点意思,但是不完全透彻。
其实问题在于串口返回数据时,它返回的速度可能不会太快,而程序执行是非常快的。
也就是说,当执行到Read语句时,串口根本没来得及返回那么多的数据,如你说的,只返回了9个字节。即便你指定bytesToRead大小也没有用。
解决办法:只能通过控制代码来实现你想要的功能,我认为有两种方案可供使用:
一、设置一个大小为59的缓存,写一个while循环,只有从串口读满59个字节的数据时才退出while循环,否则继续读取。
二、思想跟第一种类似,只是不写while循环,利用调用函数思想,当存满59个字节时,返回true,否则返回false,继续读取串口数据。
希望对楼主有用。
bytesRead = serialPort.Read(BRecieve, 0, bytesToRead);
楼上的说法有点意思,但是不完全透彻。
其实问题在于串口返回数据时,它返回的速度可能不会太快,而程序执行是非常快的。
也就是说,当执行到Read语句时,串口根本没来得及返回那么多的数据,如你说的,只返回了9个字节。即便你指定bytesToRead大小也没有用。
解决办法:只能通过控制代码来实现你想要的功能,我认为有两种方案可供使用:
一、设置一个大小为59的缓存,写一个while循环,只有从串口读满59个字节的数据时才退出while循环,否则继续读取。
二、思想跟第一种类似,只是不写while循环,利用调用函数思想,当存满59个字节时,返回true,否则返回false,继续读取串口数据。
希望对楼主有用。
展开全部
你可以在接受字节的程序开始时延迟等待一会,这个时间要根据数据长短不同进行调节。这是最笨的方法。楼主可以试试ReadLine()或者ReadTo()方法。
如果你收到的数据是固定字节数就简单了,直接设置ReceiveByteThreshold属性为你接收的字节数就可以了。
如果你收到的数据是固定字节数就简单了,直接设置ReceiveByteThreshold属性为你接收的字节数就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我和你是一样的问题,我接收的数据不确定是不是定长的,所以我在DataReceived这个事件里面第一行增加了一个Thread.Sleep(1),发现能接收大部分数据,有一个数据没接受完整,然后我把休眠时间设置成了10,好像效果还可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-12-10
展开全部
去 百度文库里 搜搜 看
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询