你应该另起线程,或者通过backgroundworker来执行界面的更新和收发。
你目前是将所有的处理都放在一个主线程中进行的,界面的更新就在这个主线程中,难免会引起界面卡死。
一个线程的执行相当于过程性的执行,是顺序执行,势必在某个 *** 作耗时的时候会对界面更新或数据收发产生影响。
可以将源代码通过邮件发给我看看iaskall@163com
1、你滴,是神马单片机?这么牛,能直接发送汉字?还能只要一个地址传递就能将英汉混合字符串分存成单字节Byte(s[i])数组? 如果单片机不能,那么是你滴编译系统能?
2、你滴单片机串口收/发中断是能分开设置是否中断滴么?看你程序收用中断发用查询,51不能分设吧?
3、在没有FIFO的单片机里,一般串口收/发完成1个字节会中断一次,看你程序貌似是发完一串字符才置位TI,这样用当然是不对滴。正确的方法是发完一个字节中断后再发下一个字节(有点烦是吧^_^); 试试下面的方式调试:
unsigned char s[]={0,1,2,3,4,5,6,7,8,9};
unsigned char len = 10;
void sio_int() interrupt 4 //串口中断函数
{
if (RI )
{
RI = 0;
……
}
if(TI)
{
TI = 0;
if(len)
{
SBUF = s[10 - len ];
len--;
}
}
}
socket导致winform项目崩溃的原因是socket在write的时候,调用线程和socket创建的线程不一致。根据查询相关公开信息显示:在其他线程调用了write函数,需要通过信号跳转到socket创建的线程调用write,如果WinForm程序中使用了线程,而线程调用的代码中会抛出异常,该异常没有任何Try块处理,就会导致程序从主线程中跳出,导致WinForm程序突然崩溃性关闭,程序读写某些外部资源,比如数据库、串口、并口、网络等,当这些资源发生堵塞或者出现问题,有可能会导致WinForm程序长时间处于等待状态,程序就会类似于死机现象,写程序的时候,程序出现逻辑错误,导致死循环,或者线程死锁,如果该程序是在主线程中,就会导致WinForm程序死机。
要么串口不存在,要么串口已经被其他程序打开了。
你先检查一下自己要打开的串口是否存在,如果你是windows系统,就看设备管理器,
如果你是linux系统就查看/dev下有没有你的串口设备。
如果串口是在的,那么可能有其他程序已经打开它了,正在使用,简单的方法就是重启一下电脑,串口就会回到未打开的状态。
我觉得是这样子的,关闭中断是为了避免更高优先级的中断信号抢占MCU的资源,因为你所设置的串口通讯模式必须保证上位机、下位机时序一致,如果这时候中断,则会时序混乱,通讯错误,很多单总线的IC工作时也要关闭中断就是为了避免更改优先级中断导致时序混乱问题。
并不是你不关中断就一定不能正常工作,这只是避免一些隐患问题。
这种错误大多是 波特率的时序偏差
方法一: 你可以差少波特率 比如 4800 试试还有没有识码
方法二: 稍调整一下定时器的值
另外12M也可以,只要计算一下定时器的值 TH1的值
用110592算下来 TH1正好是个整数
用12 TH1有偏差 所以一般用110592精确
以上就是关于C# 串口导致界面卡死全部的内容,包括:C# 串口导致界面卡死、单片机串口死机,发送一个命令进去执行一次就没反应了,必须重启单片机,这是怎么回事、socket导致winform项目崩溃等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)