cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1890|回复: 6

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

[复制链接]
发表于 2009-11-2 16:43:55 | 显示全部楼层 |阅读模式
本帖最后由 qinqinbaibai 于 2009-11-3 09:32 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2009-11-2 22:37:30 | 显示全部楼层
没明白你说的两者通信,是界面和谁?
你说的死机是假死,开多线程吧
发表于 2009-11-3 08:34:30 | 显示全部楼层
我也不太明白!
比如说界面在哪台机器上,键盘又在哪台机器上?
编码器又是如何旋转的?——因为大家都没见过你的程序和实际情况,你最好自己组织一下,能让大家明白。
 楼主| 发表于 2009-11-3 09:24:22 | 显示全部楼层
sorry^_^
确实没有描述清楚
是这样的,我通过软件做了一个界面,然后通过232串口连接一个做好的模拟键盘,(做的界面和键盘一摸一样),目的是实现两者能够相互通信,比如按键盘的某个键,在模拟界面上对应的键作出反应。

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

下面把我的程序和界面图片发给大家,帮忙瞧瞧,到底是怎么回事呢。。。。。[img][code][/code][/img]
发表于 2009-11-3 11:14:38 | 显示全部楼层
我的一个个人意见,也不知道对不对啊
第一、我的理解是你做个界面,然后后某个下位机的通信,键盘是下位机的实际键盘
第二、你的界面一次接收的字符是三个字节对吗?,可是如果下面的键盘连发几串数据的话,你用什么协议分辨出什么是帧头呢?我觉的你说的能接到数据是你跟踪到的,可是如果数据的顺序一混乱,根本就不能作出正确的判断了。
 楼主| 发表于 2009-11-3 12:33:50 | 显示全部楼层
对 ,您说的是。
那我该怎么解决这个问题呢
5# 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;    //----处理完毕,清零恢复初始状态----
}
仅仅参考....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-20 22:24 , Processed in 0.677987 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表