串口通信,多线程同步的问题。
用c#.net开发,在wince运行。
通过串口向单片机发送数据a,单片机回复数据b,然后在向单片机发送数据c,单片机在回复数据d。就是这样两次 一问一答式的数据发送接收,我按平常的方式 用port.Output = buf 这样写发送,然后在 private void port_DataReceived() 这个过程中写接收事件,并在这个事件中写发送数据c的程序。 在接收的过程中 有把 接收的数据显示在文本框里。
可是 这样接受发送几次后,程序会突然死掉,界面没有反应了。
我想是不是因为发送接收的事件阻塞导致的,就试着用多线程来处理。
建立了个主线程A,然后在线程A中先创建发送线程B,后创建接收线程C,可是还是不行,程序会死掉。我后来才知道,线程B,C创建的顺序跟执行的顺序不一致,所以我想知道用c#怎么写 多线程同步的代码,就是要能 在线程b执行完后在执行线程c!
或者程序中要要怎么做才能处理好串口通信中的 发送与接受的关系,保证通信不会死掉?
问题点数:50、回复次数:10Top
1 楼wl2zw(磊)回复于 2004-12-01 20:07:02 得分 0
自己顶Top
2 楼raulredondo()回复于 2004-12-01 20:11:57 得分 0
只需要两个线程就可以了,一个是界面,一个是接受和发送。
收到了就马上发送,然后把自己挂起,下次串口中断来的时候再把线程唤醒Top
3 楼wl2zw(磊)回复于 2004-12-01 20:25:27 得分 0
能不能把代码贴点出来让我看看,我不熟悉c#,也不熟悉多线程啊。。。Top
4 楼raulredondo()回复于 2004-12-01 22:46:30 得分 0
Thread t;
this.t = new Thread(new ThreadStart(target));
void target()
{
while(true)
{
// Receive and send
this.t.ThreadState = ThreadState.Suspend;
}
}
// com event
void on_Comm(.....)
{
this.t.Resume();
}
代码是手写的,肯定有语法错误,你就当伪代码看好了
还有,你要在合适的地方打开线程Top
5 楼wl2zw(磊)回复于 2004-12-02 08:33:37 得分 0
恩,我是在c#.net中新建了个智能设备应用程序 来开发的,可是它不支持 this.t.ThreadState = ThreadState.Suspend 跟 this.t.Resume(); 这样的方法啊,我用c#建立了普通的windows应用程序的话,就可以,这是为什么呢??Top
6 楼wl2zw(磊)回复于 2004-12-02 10:50:38 得分 0
还有有什么办法确定我 第一次发送数据a 给单片机,单片机接收后有返回值b过来呢,要怎么做到我我接受b后然后在发数据c下去呢Top
7 楼raulredondo()回复于 2004-12-02 19:38:15 得分 0
.NET Framework 精简版不支持Resume和ThreadState,你可以查一下msdn
第二个问题,你只好自己做一下记录,看看前面一次发送的是不是aTop
8 楼wl2zw(磊)回复于 2004-12-02 21:47:53 得分 0
郁闷啊,搞不懂。
现在有个错误是 :
试图创建 System.Windows.Forms.Form 的实例时发生异常。异常为“无法加载 DLL (AGL)。”。
我的窗体设计器打不开了,出现错误,这是为什么?
我是用c#创建一个普通的windows应用程序,然后有加了个OpenNETCF 这类,引用了 using OpenNETCF.IO.Serial; 后来编译的时候出错了。Top
9 楼wl2zw(磊)回复于 2004-12-03 08:58:59 得分 0
线程a,b我要实现的功能: 线程a执行完然后在执行线程b,接着在执行线程a,然后继续b,一直这样循环,请问要怎么写? 不能用private System.Threading.ReaderWriterLock rwl=newreadrwriterlock(); 因为我是在c#创建智能设备应用程序下进行开发的,所以就如raulredondo() 所说的NET Framework 精简版不支持这些方法,请问要怎么实现我要的功能???Top
10 楼raulredondo()回复于 2004-12-04 13:55:39 得分 50
自己设一个标志,然后让另外一个线程一直保持死循环,每次循环都判断一次,看是不是执行下面的语句,否则就continue,不过这个方法很快就会把你的pda的电消耗光的Top




