qinqinbaibai 发表于 2009-11-2 16:43:55

模拟一个键盘界面,在调用小键盘上编码器时候出现死机现象,怎么解决呢?

本帖最后由 qinqinbaibai 于 2009-11-3 09:32 编辑

做的是一个模拟键盘的界面,其他按键和键盘上一样,多了一个编码器旋钮,当按键盘上其他按钮时,键盘和界面的通讯很正常,但是当旋编码器按钮时,两者通信出现问题,界面能给键盘发送数据,界面也能收到键盘发的数据,但是就是执行不了,出现死机现象。初步判断是编码器每旋一次转动的圈数过多,发给串口的数据过多,导致处理不过来就死了。想请问一下各位大侠,怎么解决这个问题呢。。。。。谢谢了。

rebelwj 发表于 2009-11-2 22:37:30

没明白你说的两者通信,是界面和谁?
你说的死机是假死,开多线程吧

netcreature 发表于 2009-11-3 08:34:30

我也不太明白!
比如说界面在哪台机器上,键盘又在哪台机器上?
编码器又是如何旋转的?——因为大家都没见过你的程序和实际情况,你最好自己组织一下,能让大家明白。

qinqinbaibai 发表于 2009-11-3 09:24:22

sorry^_^
确实没有描述清楚
是这样的,我通过软件做了一个界面,然后通过232串口连接一个做好的模拟键盘,(做的界面和键盘一摸一样),目的是实现两者能够相互通信,比如按键盘的某个键,在模拟界面上对应的键作出反应。

至于rebelwj 说的开多线程,我理解不透,因为初学,很多东西还不懂,这个通信过程只通过串口232实现收发功能。

下面把我的程序和界面图片发给大家,帮忙瞧瞧,到底是怎么回事呢。。。。。

rebelwj 发表于 2009-11-3 11:14:38

我的一个个人意见,也不知道对不对啊
第一、我的理解是你做个界面,然后后某个下位机的通信,键盘是下位机的实际键盘
第二、你的界面一次接收的字符是三个字节对吗?,可是如果下面的键盘连发几串数据的话,你用什么协议分辨出什么是帧头呢?我觉的你说的能接到数据是你跟踪到的,可是如果数据的顺序一混乱,根本就不能作出正确的判断了。

qinqinbaibai 发表于 2009-11-3 12:33:50

对 ,您说的是。
那我该怎么解决这个问题呢
5# rebelwj

rebelwj 发表于 2009-11-3 16:24:22

本帖最后由 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]
查看完整版本: 模拟一个键盘界面,在调用小键盘上编码器时候出现死机现象,怎么解决呢?