c#串口多线程数据读写问题

脚跟着地 2010-03-13 12:56:46
设计一个串口的程序,硬件是USB转485的,要读出设备的数据并保存。

SerialPort类有DataReceived事件,所以读串口可以不用自己设线程了。因为要经常询问以得到设备的数据,所以要重启一个线程去读。单不知如何实现?

因为在询问数据时可能还会有其他的操作发出串口的命令,怎么样做才能避免相互的干扰?

因为是485的,所以自己发出的数据也是能收到的,数据比较乱,不知如何分析取得的字符串?

自己做了一点程序,在执行到join时总是死机。

private void btnOpenPort_Click(object sender, EventArgs e)
{

if (comport.IsOpen)
{
comport.Close();

getDataThread.Join();

}

else
{
comport.BaudRate = int.Parse(cmbBaudRate.Text);
comport.DataBits = int.Parse(cmbDataBits.Text);
comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);
comport.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);
comport.PortName = cmbPortName.Text;
comport.ReadTimeout = 500;
comport.WriteTimeout = 500;

try
{
comport.Open();
getDataThread.Start();
}
catch (Exception)
{
MessageBox.Show("串口被占用!");
}

}

EnableControls();

if (comport.IsOpen) txtSendData.Focus();
}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytes = comport.BytesToRead;

byte[] buffer = new byte[bytes];

comport.Read(buffer, 0, bytes);

Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
}

private void GetData()
{

while (comport.IsOpen)
{
byte[] data = HexStringToByteArray("FD 01 00 C8 00 FE");

try
{
comport.Write(data, 0, data.Length);
}
catch (Exception)
{

MessageBox.Show("数据发送错误!控制器无响应!");
}

Log(LogMsgType.Outgoing, ByteArrayToHexString(data) + "\n");
}

}
...全文
1624 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Iceman 2011-04-06
  • 打赏
  • 举报
回复
0-90-09-09-
feier2004 2010-10-07
  • 打赏
  • 举报
回复
我与楼主遇到了同样的问题。
正在寻求解决方法...
Return门徒 2010-03-13
  • 打赏
  • 举报
回复
aaaaaaaaaaaaaaaaaaaaaaaaaaaa
Return门徒 2010-03-13
  • 打赏
  • 举报
回复
aaaaaaaaaaaaaaaaa
脚跟着地 2010-03-13
  • 打赏
  • 举报
回复
楼上说的有理,我现在是做的延时等待。
xingyuebuyu 2010-03-13
  • 打赏
  • 举报
回复
你发送过去的数据如果恰好是一个仪器会动作的command,那么仪器自然会作相应的反应,你不停的发送,仪器自然不停的反应,所以才会觉得数据比较乱,你应该是发完一个command,然后等待仪器作完反应,也就是等仪器把这次command对应的回传值全部发送完,然后你接收完确认正确后再发送下一个command,这样数据才不会乱,而不是一直不停的发送,这样数据肯定会乱的
脚跟着地 2010-03-13
  • 打赏
  • 举报
回复
顶一下
脚跟着地 2010-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouzhangkui 的回复:]
http://www.cnblogs.com/SimonZhou/archive/2009/06/17/1505277.html
[/Quote]

拜托你看的仔细一点!我已经做到这个地步了。我是要一直发数据的,不是能用事件触发的。还有数据怎么样能做到不混淆!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧