C#串口接收函数多线程的问题
这个问题困扰了我两天,全程利用RS232短接引脚自发自收:
CSDN提示没没有分来提这个问题,我都不知道能不能提出来这个问题
我做了2件事:
第一件:定义了一个串口接收函数:
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
buf = new byte[n];//声明一个临时数组存储当前来的串口数据
comm.Read(buf, 0, n);//读取缓冲数据
}
第二件事:定义了一个串口自动发送函数:
private void timer1_Tick(object sender, EventArgs e)
{
System.Timers.Timer time2 = new System.Timers.Timer();
time2.Interval = 5;//时钟的间隔为100ms
if (comm.IsOpen)
{
qufen = 0;
string ComString = "12 34 56 78 90 AB CD EF";
int len = ComString.Length / 2;
byte[] bytesend = HexStringToByteArray(ComString);(将string转为byte数组,公式是正确的,我看过)
comm.Write(bytesend, 0, bytesend.Length);
time2.Start();//时间开始启动
DateTime dtnow = DateTime.Now;
while (true)
{
DateTime dtend = DateTime.Now;
System.TimeSpan ts = dtend - dtnow;
int a = Convert.ToInt32(ts.TotalMilliseconds);
if (comm.BytesToRead == 8 || a >= 30)
{
time2.Stop();
break;
}
else
{
Thread.Sleep(1);
}
}
int n = comm.BytesToRead;
comm_DataReceived(null, null);
}
}
全程单步执行,利用串口监视工具全程严格监视:
单步执行,发现如下:
1)第一个发送周期:发送和接收全部在上述代码中蓝色的代码处(分别对应于write和read)发生,全部为正确;
2)第二个发送周期:发送在上述代码中蓝色代码处(对应于write)发生,为正确;但是接收却发生在上述代码中的红色代码处(time2.Start();或者 DateTime dtnow = DateTime.Now;处);
这是为什么???我根本没有给它read的命令!!它为什么自己会读上来????导致我后续的comm_DataReceived(null, null)调用接收函数时却没有东西可收!!!!!,这到底是为什么!!!!!!3)第三个发送周期:同第一个周期;
4)第四个发送周期:同第二个周期;
......以此类推
上述情况是为什么?》????????????????????????
有人说这是不同的线程触发的:就是DataReceive是一个辅线程,在主线程触发发送时,数据已经收到,DataReceive函数就会自动触发(在while循环执行的时候就触发接收了),用不着在后面调用comm_DataReceived(null, null)来做多余的操作;
上面的解释对于偶数次(第二个发送周期、第四个发送周期......)好像是对的,但是如果是这样的话,我反问一句:那为什么奇数次发送周期(第一次发送周期、第三次发送周期......)却没有自动触发接收,一定要等到我通过comm_DataReceived(null, null)调用接收函数的时候才会真正的触发接收呢??? 这不是自相矛盾吗?????
这个问题应该是一个多线程处理的问题。
我是一个新手,
请高手务必就事论事,就我的程序来发表意见,不要给一个单词,一句话!!!您是高手,我承认,但您简单的说一句话、一个单词,小弟我是真的真的真的真的真的真的看不懂!!!!!!!!!!!!!!!!!!!!!!!!
我最终想达到稳定接收的目的:就是想让它什么时候接收,就什么时候接收;什么时候清空,就什么时候清空!!!!!!
麻烦给出修改程序的建议 谢谢!!!!!