C# serialport类编写串口通信程序,无法接收全部数据!

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();
请高手帮我看看
这个是图片,静待佳音

问题应该是出在这句:
bytesRead = serialPort.Read(BRecieve, 0, bytesToRead);
楼上的说法有点意思,但是不完全透彻。
其实问题在于串口返回数据时,它返回的速度可能不会太快,而程序执行是非常快的。
也就是说,当执行到Read语句时,串口根本没来得及返回那么多的数据,如你说的,只返回了9个字节。即便你指定bytesToRead大小也没有用。
解决办法:只能通过控制代码来实现你想要的功能,我认为有两种方案可供使用:
一、设置一个大小为59的缓存,写一个while循环,只有从串口读满59个字节的数据时才退出while循环,否则继续读取。
二、思想跟第一种类似,只是不写while循环,利用调用函数思想,当存满59个字节时,返回true,否则返回false,继续读取串口数据。
希望对楼主有用。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-14
你可以在接受字节的程序开始时延迟等待一会,这个时间要根据数据长短不同进行调节。这是最笨的方法。楼主可以试试ReadLine()或者ReadTo()方法。

如果你收到的数据是固定字节数就简单了,直接设置ReceiveByteThreshold属性为你接收的字节数就可以了。
第2个回答  2019-12-19
我和你是一样的问题,我接收的数据不确定是不是定长的,所以我在DataReceived这个事件里面第一行增加了一个Thread.Sleep(1),发现能接收大部分数据,有一个数据没接受完整,然后我把休眠时间设置成了10,好像效果还可以。
第3个回答  2011-12-10
去 百度文库里 搜搜 看

C# serialport类编写串口通信程序,无法接收全部数据!
解决办法:只能通过控制代码来实现你想要的功能,我认为有两种方案可供使用:一、设置一个大小为59的缓存,写一个while循环,只有从串口读满59个字节的数据时才退出while循环,否则继续读取。二、思想跟第一种类似,只是不写while循环,利用调用函数思想,当存满59个字节时,返回true,否则返回false,继续...

windows10 c#串口操作 无法接收数据
serialPort1.Read(buffer, 0, bytes); \/\/读取串口数据 serialPort1.ReadLine()是输入缓冲区中直到首次出现NewLine值,出现异常参见csdn 对于粘贴出的代码:首先确认使用的串口是SerialPort2还是SerialPort1,截图中你调用BytesToRead使用的是SerialPort1,而定义的响应函数名为serialPort2_DataReceived,...

c#winform开发,使用了serialport类,使用一段时间,没有数据返回
你要先确定问题出在哪里, 1发送端是不是有问题了 2.电脑串口是不是有问题(比如设置了允许电脑关闭串口节省电量) 3 检查是不是断开连接了(用其他串口调试工具看看是否能连接同一个串口),

如何用C#的serialport类接收单片机发送的数据
private string Read(){ \/\/获得返回数据 string Return = "";string ShowReturn = ""; \/\/显示的命令 try { Thread.Sleep(100);int len = this.serialPort1.BytesToRead;if (len > 0){ byte[] data = new byte[len];if (len > 0){ for (int i = 0; i < len; i++)data[i]...

C#.net编程程序与单片机连接,怎样实现呢?
C#.net有串口的控件SerialPort,通过对控件的读写,就可以与单片机通讯了;不能通讯的情况是很多的:1、上位机和单片机的串口波特率等设置是不是一致,单片机串口能正常接收吗?2、上位机和单片机的硬件是不是完好的 3、你单片机的程序是怎么写的,采用什么形式接收的??字符串还是十六进制?4、你上位...

C# 串口通信,serialport里的数据只读了一部分。
一般来说判断从下位机接收数据的方式要么是根据超时判断数据接收完结,要么是根据接收到头尾标记。所以程序里通常你得循环的 read,然后然线程sleep个几毫秒,直到读不出数据或者读到数据包尾了再把之前读到的所有字节送出。你要是想偷懒的话干脆打开串口后等一个较长的时间再接收。那基本上就不会是你...

C#中serialport控件做的串口发送和接收Form程序不对
ReadLine是阻塞读,如果发出去的数据已经过时,没有读到数据,当然卡死。界面可以按照一些串口软件来编写,例如格西烽火、串口调试助手等都不错。

C#关于serialport 接收16进制问题(谢谢)
C#关于serialport 接收16进制问题(谢谢) 50 我发送16进制到串口没问题,可以用byte[]接收时如果接收的数据大于9时问题就出现了比如:串口发送数据:050907ACA22C5865程序接收灵气:5976363635865以byte[]方式接收问题63在ascci里... 我发送16进制到串口没问题,可以用byte[]接收时如果接收的数据大于9时问题就出现了比如...

C#中的串口通信SerialPort
C#中的串口通讯使用的是System.IO.Ports.SerialPort类。通过简单操作步骤,很容易实现串口的信息收发程序,从特定串口中接收数据并发送数据。串口的使用通常与线程结合,在子线程中进行耗时和重复工作,主线程或界面则负责数据展示处理。打开和关闭串口状态需在子线程处理过程中特别注意,以防出现无法捕获的...

C# 使用serialPort连接扫描枪,open时出现“连接系统上的设备没有发挥...
重新安装串口驱动程序,可能是由于驱动程序损坏或者过期导致的问题。在代码中加入异常处理机制,当连接失败时可以显示错误信息,从而方便排除问题。总之,在使用 SerialPort 连接扫描枪时,需要注意串口参数设置以及独占串口资源的问题,确保程序能够正常连接并接收扫描枪返回的数据。如果以上方法无法解决问题,建议...

相似回答