C#窗体应用程序中调用串口1进行扫描,将串口扫描的数据进行处理发给串口2,串口1由定时器触发,为什
C#窗体应用程序中调用串口1进行扫描,将串口扫描的数据进行处理发给串口2,串口1由定时器触发,为什么将数据发给串口2,不再进行串口1的扫描,望回复为盼。...
C#窗体应用程序中调用串口1进行扫描,将串口扫描的数据进行处理发给串口2,串口1由定时器触发,为什么将数据发给串口2,不再进行串口1的扫描,望回复为盼。
展开
2个回答
展开全部
没有看到你的源代码。
1,C#串口通讯,首先要确保与com1和com2的通讯正常,也就是都已经建立通讯。
2,通过定时器去接收数据不是一个合理的办法。因为c#有个SerialPort对象,是专门用来做串口通讯的,串口发送的数据不是通过你扫描获得的,而是设备不定时发送的,你需要去捕捉这个数据发送事件后 去处理这个事件才是正确方法。
参考以下代码
启动监听
private void StartLission()
{
SerialPort SerialPort CurrentPort = new SerialPort();
CurrentPort.ReadBufferSize = 128;
CurrentPort.PortName = comName; //端口号
CurrentPort.BaudRate = bandRate; //比特率
CurrentPort.Parity =parity;//奇偶校验
CurrentPort.StopBits = stop;//停止位
CurrentPort.DataBits = databit;//数据位
CurrentPort.ReadTimeout = 1000; //读超时,即在1000内未读到数据就引起超时异常
//数据发送时 触发Sp_DataReceived函数
CurrentPort.DataReceived += Sp_DataReceived;
CurrentPort.Open();
}
获取设备的数据发送事件后的处理函数
private static void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
SerialPort sp = sender as SerialPort;
if (sp == null)
return;
try
{
byte[] readBuffer = new byte[sp.ReadBufferSize];//扩大接收数据量
sp.Read(readBuffer, 0, readBuffer.Length);
//重新构造一个com2的通讯代码,并将readBuffer数据发送到com2
最重要通讯结束后一定要记得关闭通讯。
}
catch{}
}
更多追问追答
追问
串口1的打开调用了一个外部类,串口2数据写入以字节数组形式,读取亦然。问题在于需要对串口1进行扫描,扫描的数据此时应有一个暂停,开始往串口2发送,当串口1扫描到数据问题出现在扫描中断了。
追答
如果你的扫描代码没问题,那么 可能问题是你的线程阻塞造成的,,之所以 我给你谢了上述代码 是因为上述代代码不需要你去扫描端口,扫描是低效的,而通过com!接收的数据直接通过事件的方式才最合理,
你可以将 com1的扫描代码 放在一个独立的线程中。而发送数据的代码放在另一个线程中,这样线程1扫描到数据引发事件 ,将事件抛给线程2,这样一来 线程1只需要不断扫描,引发事件即可。可以是个死循环,不需要管给com2发送数据的逻辑。
而线程2 只需要被动的等待线程1中引发事件,并在事件处理中将数据转发给com2即可。两个操作互相关联又互补干扰。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询