模拟一个键盘界面,在调用小键盘上编码器时候出现死机现象,怎么解决呢?
本帖最后由 qinqinbaibai 于 2009-11-3 09:32 编辑做的是一个模拟键盘的界面,其他按键和键盘上一样,多了一个编码器旋钮,当按键盘上其他按钮时,键盘和界面的通讯很正常,但是当旋编码器按钮时,两者通信出现问题,界面能给键盘发送数据,界面也能收到键盘发的数据,但是就是执行不了,出现死机现象。初步判断是编码器每旋一次转动的圈数过多,发给串口的数据过多,导致处理不过来就死了。想请问一下各位大侠,怎么解决这个问题呢。。。。。谢谢了。 没明白你说的两者通信,是界面和谁?
你说的死机是假死,开多线程吧 我也不太明白!
比如说界面在哪台机器上,键盘又在哪台机器上?
编码器又是如何旋转的?——因为大家都没见过你的程序和实际情况,你最好自己组织一下,能让大家明白。 sorry^_^
确实没有描述清楚
是这样的,我通过软件做了一个界面,然后通过232串口连接一个做好的模拟键盘,(做的界面和键盘一摸一样),目的是实现两者能够相互通信,比如按键盘的某个键,在模拟界面上对应的键作出反应。
至于rebelwj 说的开多线程,我理解不透,因为初学,很多东西还不懂,这个通信过程只通过串口232实现收发功能。
下面把我的程序和界面图片发给大家,帮忙瞧瞧,到底是怎么回事呢。。。。。 我的一个个人意见,也不知道对不对啊
第一、我的理解是你做个界面,然后后某个下位机的通信,键盘是下位机的实际键盘
第二、你的界面一次接收的字符是三个字节对吗?,可是如果下面的键盘连发几串数据的话,你用什么协议分辨出什么是帧头呢?我觉的你说的能接到数据是你跟踪到的,可是如果数据的顺序一混乱,根本就不能作出正确的判断了。 对 ,您说的是。
那我该怎么解决这个问题呢
5# rebelwj 本帖最后由 rebelwj 于 2009-11-3 16:27 编辑
6# qinqinbaibai
程序部分应该基本不需要改....
串口中断仍然还是这样设置,每一个字节中断一次(我没有用过中断模式,按你说的描述)
在中断函数部分处理
可以仿效其他通信协议,比如用时间间隔来控制或者加帧头。
比如简单一点的加帧头,抄袭某个协议以0xaa, 0x55为帧头(你不一定要这样,选个你感觉比较方便的,一个字节也行)。
在你的中断函数里,定义个静态局部变量,比如说是static int rec_flag = 0;,同样的静态局部变量定义一个rec_num
然后在你用的buffer接收一个字节(不是你原来的三个)
然后
if (rec_flag == 0)
{
if (buffer == 0xaa)
{
rec_flag = 1;
}
}
else if (rec_flag == 1)
{
if (buffer == 0x55)
{
rec_flag = 2;
rec_num = 0; //---缓冲区长度清零
}
else //---出错处理----------
{
rec_flag = 0;
}
}
else if (rec_flag == 2)
{
;//---这里向你的接收缓冲区存数据
rec_num++;
if (rec_num >= 3)//-----作个判断,如果接到的数据是你要的长度比如你现在设置的是3,也可以是其他数,一桢数据结束--
{
rec_flag = 3;
}
}
if (rec_flag == 3) //---这里不加else,或者这个判断也可以不要,把下面的程序归到上面那个判断长度下面也行
{
;//-----这里用你原来响应函数那个大 switch分支下面的那堆程序处理吧
rec_flag = 0; //----处理完毕,清零恢复初始状态----
}
仅仅参考....
页:
[1]