C#向串口发送指令不稳定

来源:百度知道 编辑:UC知道 时间:2024/06/16 02:34:11
我最近要做个上位机程序,用VS2005中要利用SerialPort类向串口发送16进制的指令,我做了个测试的控制台程序之后不能正常读取数据,但是在调试状态下能够读取的到,不过偶尔读取的是乱码.这是怎么回事.

我分析原因可能是执行的速度过快导致串口不能正常响应.

以下是部分代码
SerialPort sp = new SerialPort();
if (sp.IsOpen)
sp.Close();
sp.ReadBufferSize = 1024;
sp.BaudRate = 9600; //速率
sp.DataBits = 8;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.ReadTimeout = 1000;//超时
sp.PortName = "COM1";
Message = "3a3032303430300d0a"; //要发送的指令码
SendData(); //发送指令码的函数
ToII(); //读取并截取字符串并转化为10进制的函数
if (sp.IsOpen)
sp.Close();

是不是太快了,加个延时试试

你的分析不错。

串口本来的速度都不是很快。

而且,不同的设备有一定的响应速度。。。。
具体要看你设备是什么东西,还要看你的接口是什么标准的。

如果上位机和下位机的程序没有bug,一般通讯出问题都是由于两次通讯间隔太短造成的,这样的情况一般都是这个原因,通讯失败不是本句造成的,和前后的代码有很大关系,以下几点建议:
1、单步调试程序,如果通讯不会失败,那就要调整代码,降低通讯的频率;
2、修改通讯协议,在下位机增加响应位,PC每发一次指令后等待响应,这样可以完全避免软件造成的通讯失败;PC端程序还可以增加延时判断,这样子串口通讯的代码会非常强壮。
另外要注意的,不可按照理想的波特率计算通讯指令发送的频率,显示和理论还是有很大差异的;高的波特率会产生噪音,长距离通讯会有问题。
解决的办法是 连续发送
sp.WriteLine("STOP");
sp.WriteLine("STOP");
sp.WriteLine("STOP");
sp.WriteLine("STOP");
延时
一般最好的效果是在700~1200毫秒,