串口通信中serialport.read和serialport.bytestoread的区别
时间: 2023-09-27 14:10:33 浏览: 219
serialport.read是一个阻塞函数,它会一直等待直到读取到指定长度的数据或超时。如果读取成功,它会返回读取到的字节数据。如果读取失败,它会返回空字节串。
serialport.bytestoread是一个非阻塞函数,它会返回当前串口缓冲区中尚未读取的字节数。如果缓冲区中没有数据可读,它会返回0。
因此,serialport.read用于从串口中读取指定长度的数据,而serialport.bytestoread则用于查询当前可用的数据量,以便进行下一步的处理。
相关问题
try { //因为要访问UI资源,所以需要使用invoke方式同步ui this.Invoke((EventHandler)(delegate { //EE B1 10 00 11 00 05 31 30 30 FF FC FF FF 接收写入100 byte[] a = { 0xEE, 0xB1, 0x10, 0x00, 0x11, 0x00, 0x05 }; byte[] a2 = { 0xFF, 0xFC, 0xFF, 0xFF }; // 接收下位机返回的数据 byte[] a3 = new byte[serialPort1.BytesToRead]; serialPort1.Read(a3, 0x00, a3.Length); } ) ); }把这段代码写成输入文本框的值只有100
抱歉,我不能执行代码,但我可以帮你解释一下。这段代码是使用C#语言编写的,使用了委托和Invoke方法实现了访问UI资源的同步。其中包含了串口通信的代码,通过读写字节数组实现数据的传输。如果你想让输入文本框的值只有100,你可以在byte[] a的定义中将“0x31,0x30,0x30”改为“0x31,0x30,0x30,0xFF,0xFC,0xFF,0xFF”,这样就可以向下位机传输固定的数值100了。但是需要注意的是,这段代码需要在正确的环境下运行,否则可能会出现错误。
List<byte> sp_buffer = new List<byte>(4096); //串口缓存区 int sp_buffer_max = 4096; //串口缓存区最大缓存字节数 private void SerialDataReceive(object sender, SerialDataReceivedEventArgs e) //接收串口数据 { if (serialPort1.IsOpen == false) { serialPort1.Close(); return; } int Byte_len = serialPort1.BytesToRead; //读取缓存的数据长度 byte[] Rc_byte = new byte[Byte_len]; //定义一个字节数组 serialPort1.Read(Rc_byte, 0, Byte_len); //将缓存数据存储进字节数组里面 if (sp_buffer.Count > sp_buffer_max) //缓存超过字节数 先丢弃前面的字节 sp_buffer.RemoveRange(0, sp_buffer_max); //丢弃前面的字节0到sp_buffer_max,存入后进的数据 //?????????????????? sp_buffer.AddRange(Rc_byte); //存入缓存区 byte[] ruffer = new byte[9192]; //用来存放缓冲区的数据流 //??????? //对数据流进行筛选,缓冲区每一组数据个数大于4则为我们想要的数据流 if (sp_buffer.Count > 4) { sp_buffer.CopyTo(0, ruffer, 0, sp_buffer.Count); Task.Run(() => printf_data(ruffer, sp_buffer.Count, 1)); //打印数据流 } }
这段代码实现了串口数据的接收和缓存,并对数据进行筛选后打印出来。
首先,定义了一个名为 sp_buffer 的 List<byte> 类型的缓存区,用于存储串口接收到的数据。同时,定义了一个 sp_buffer_max 变量,表示缓存区的最大缓存字节数为 4096。
接着,在 SerialDataReceive() 方法中,先判断串口是否打开,若未打开则关闭串口并返回。接着,利用 serialPort1.BytesToRead 属性获取串口缓存的数据长度 Byte_len,再定义一个字节数组 Rc_byte,用于存储缓存数据。
然后,利用 serialPort1.Read() 方法将缓存数据存储进字节数组 Rc_byte 里面。接下来,判断缓存区 sp_buffer 的字节数是否超过了设定的 sp_buffer_max,若超过则先丢弃前面的字节0到sp_buffer_max,再存入后进的数据。最后,利用 sp_buffer.AddRange() 方法将缓存数据存入缓存区 sp_buffer。
最后,定义了一个名为 ruffer 的字节数组,用于存放缓冲区的数据流。利用 sp_buffer.Count 属性获取缓存区中数据的个数,若大于4,则将 sp_buffer 中的数据复制到 ruffer 数组中,并利用 Task.Run() 方法打印数据流。
阅读全文