串口通讯中消息收发顺序控制及多线程问题

本文概述了串口通讯中如何通过AutoResetEvent实现消息发送与接收的同步,以及如何使用Lock解决多线程情况下发送导致的接收数据错误问题。
摘要由CSDN通过智能技术生成

在串口通讯中可能会遇到一些问题,现基于工作中遇到的情况做一个总结

第一类:消息收发控制

具体描述:当发送一条消息后,在收到数据之后才能算正常流程走完,再执行其他数据的发送
这种情况可通过AutoResetEvent这个类进行控制消息发送与接收,具体用法如下:

AutoResetEvent receiveSignal = new AutoResetEvent(false);
AutoResetEvent sendSignal = new AutoResetEvent(false);

void Send(byte[] data)
{
	this._serialPort.Write();
	this.sendSignal .Set();
	this.receiveSignal.WaitOne();
}
 private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
 {
 	this.sendSignal.WaitOne();
 	//接收处理
 	this.receiveSignal.Set();
 }

多线程问题

描述:当同一个串口封装类中的方法,如发送方法被多个线程同时调用时,可能导致接收的数据不正确,可以使用Lock对发送加锁

private object lockObject = new object(); // 用于锁定的对象
public void Write(string data)
    {
        lock (lockObject) // 锁定
        {
            serialPort.WriteLine(data);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月光使者1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值