c# - 为什么我的 serial.write 发送数据两次
问题描述
我试图通过创建一个应用程序来模拟通过串行端口发送数据的微控制器,该应用程序通过接收例程将字节连续发送到另一个应用程序以用于 GUI 目的。
我正在使用这种方法从发送者实例发送我的字节:
Write(vout, 0, 13);
其中 Write 定义为:
public void Write(byte[] buffer, int offset, int count)
{
// preconditions checks are omitted
serialPort1.Write(buffer, offset, count);
}
vout是我从实时模拟传感器的数据中手动填充的字节数组。
在 GUI 应用程序中接收数据时,我使用的是:
private void comport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (!comport.IsOpen) return;
int bytes = comport.BytesToRead;
//For loop for getting all values in buffer to 0
comport.Read(buffer, 0, 13);
Update_counter();//Updates counter by 1.
}
第二次/之后的任何时候我发送一些东西,它被发送了两次,或者至少这是我的计数器变量所暗示的。
我不确定这是否与实际的串行缓冲区有关,或者我是否错误地使用了写入和读取方法。
另外,我将 COMPORT 设置为 9600 波特率、8 位、停止位 1、奇偶校验无。
任何帮助表示赞赏。
解决方案
问题的原因是,您读取的字节数比现在可用的字节数多:
int nrOfAvailableBytes = comport.BytesToRead;
comport.Read(buffer, 0, 13);
因此,即使comport 告诉您只有一个字节可用,您还是决定读取13 个字节。
SerialPort.Read告诉你:
如果 count 大于输入缓冲区中的字节数,则读取的字节数会更少。
解决方案:只读取当前可用的字节。
推荐阅读
- .net - API 应用单端口多应用 IIS
- python - 在 Pandas 数据框中具有依赖性的条件累积和
- react-native - React Native 无法访问 4G 中的沙箱,但可以在 Wifi 中工作
- spring-boot - 在 JPA 存储库(Spring Data Jpa)中执行自定义查询
- python - Python项目设置损坏
- ceph - 如何配置 Ceph rgw sts 密钥
- laravel - 当有人单击laravel 8中的复选框时如何调用控制器功能
- pandas - Pandas 简单的 API 可以找出所有 inf 或 nan 单元格?
- actions-on-google - 调度智能家居操作
- php - 如何调试 codeigniter Web 应用程序上的问题