| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 776 人关注过本帖
标题:请教一个串口编程问题啊
只看楼主 加入收藏
yixiangke
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-7-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
请教一个串口编程问题啊
我想编一个计算机和单片机通信的程序,用VC6,主界面是一个对话框,上面有一个编辑框、几个图片和几个按钮。
串口数据格式有两种
如果电脑接收到的信号是05 21 ......... 0D共25位就显示在编辑框
如果电脑接收的信号是05 22 ....   0D 00共10位就改变图片表示。
电脑接收到一串信号,不管是那种,都向单片机发出键盘状态信号,格式为05 41 ........ 0D 共10位。
如果有按键被按下,则10位数据中的某一位会变化,但是也要等收到单片机信号才会发出。

我用MSComm编程,现在我的问题是
如果我接收一个字节就触发OnComm,也就是设置如下:
    m_ctrlComm.SetSettings("19200,n,8,1");
    m_ctrlComm.SetRThreshold(1);
   m_ctrlComm.SetInputLen(1);
开机屏幕显示正常。但是按下按键后,单片机的状态有了变化,编辑框的显示却没有变化。
如果我改成10个字节触发一次OnComm,也就是设置如下:
 m_ctrlComm.SetSettings("19200,n,8,1");
    m_ctrlComm.SetRThreshold(10);
   m_ctrlComm.SetInputLen(10);
效果就好的多,按下按键后单片机有反应,编辑框也有反应,但是反应有点慢。
有时要连按两下按键。
如果我改成20个字节触发一次OnComm,也就是设置如下:
 m_ctrlComm.SetSettings("19200,n,8,1");
    m_ctrlComm.SetRThreshold(20);
   m_ctrlComm.SetInputLen(20);
反应就更快一点,但是我总感觉有丢失数据的现象。
而且如果接收的第一个信号不是05,也就是正好从中间开始接收信号
程序好像就不太正常。
我该从哪里下手修改程序呢?
是不是不能用OnComm啊?
我是初学。领导赶鸭子上架,谢谢各位帮忙了。
搜索更多相关主题的帖子: 串口 
2010-07-23 09:17
红色警戒
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:19
帖 子:444
专家分:2967
注 册:2005-11-20
收藏
得分:20 
不知道你是怎么处理显示的

2010-07-25 14:43
yixiangke
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-7-23
收藏
得分:0 
void CSCommTestDlg::OnOnComm()
{
    // TODO: Add your control notification handler code here
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    CString strtemp,strtem1;
    int sum=0;
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    char ch;


    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {             ////////以下你可以根据自己的通信协议加入处理代码
        variant_inp=m_ctrlComm.GetInput(); //读缓冲区
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
        len=safearray_inp.GetOneDimSize(); //得到有效数据长度
            for(k=0;k<len;k++)
        {
            
            safearray_inp.GetElement(&k,rxdata+k);
        }//转换为BYTE型数组
        for(k=0;k<len;k++)
        {
            BYTE bt=*(char*)(rxdata+k); //字符型
            strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
            strtem1.Format("%02x ",bt);
            ch=(char)bt;   

        
        //m_edit1=ch;
        UpdateData(FALSE);
        if(!rxflag)
         {
            if(ch==0x05)
            {
                purx=1;
                bufrx[0]=0x05;
                bufrx1[0]=0x05;
                rxdata1[0]=0x05;
                check=0;            
            }
            
            else if(ch==0x0d)
            {
                if(purx<26)
                {
                    rxdata1[purx]=ch;
                    if(rxdata1[purx-1]=='Z' && rxdata1[purx-2]=='Z')
                    {
                        rxflag=1;
                    }
                    else
                    {
                        check-=rxdata1[purx-1];
                        check-=rxdata1[purx-2];
                        cifra1=check>>4;
                        if(cifra1>=0 && cifra1<=0x09)
                        {
                            cifra1+='0';
                        }
                        else
                        {
                            cifra1=cifra1-0x0a+'a';
                        }
                        cifra2=check&0x0f;
                        if(cifra2>=0 && cifra2<=0x09)
                        {
                            cifra2+='0';
                        }
                        else
                        {
                            cifra2=cifra2-0x0a+'a';
                        }
                        if(cifra1==rxdata1[purx-2] && cifra2==rxdata1[purx-1])
                        {
                            rxflag=1;
                        }
                    }
                }

            
                RX();
            }

            
            else
            {
                if(purx<26)
                {
                    bufrx[purx]=strtemp;
                    bufrx1[purx]=strtem1;
                    rxdata1[purx]=ch;
                    check+=ch;
                    purx++;
            
                }
            }

         }            
        }
    }
}
2010-07-27 15:39
yixiangke
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-7-23
收藏
得分:0 
void CSCommTestDlg::RX()
{//m_edit1=rxdata[2];UpdateData(FALSE);

if (rxflag)
if(rxdata1[1]==0x21)
{
{m_strRXData=" ";   
    for(int k=2;k<22;k++)
                {
                    m_strRXData+=bufrx[k];
               

               
                }
                rxflag=0;
            


    UpdateData(FALSE);
    }
}
else if (rxdata1[1]==0x22)
{
        m_strTXData="";
        for(int k=0;k<26;k++)
                {
                    m_strTXData+=bufrx1[k];
               

               
                }
    if(rxdata1[2]==0x83) m_led_warning.SetLedState(1);
    else     m_led_warning.SetLedState(0);
    if(rxdata1[2]==0x8C) m_led_ready.SetLedState(1);
    else    m_led_ready.SetLedState(0);
    if(rxdata1[6]==0xC2) m_led_xray.SetLedState(1);
    else m_led_xray.SetLedState(0);
    if(rxdata1[6]==0xC1) Beep(800,100);
    if(rxdata1[4]==0xA3) m_led_prog.SetLedState(1);
    else     m_led_prog.SetLedState(0);
    if(rxdata1[4]==0xA2) m_led_bigfocus.SetLedState(1);
    else     m_led_bigfocus.SetLedState(0);
    if(rxdata1[4]==0xA4) m_led_smallfocus.SetLedState(1);   
    else m_led_smallfocus.SetLedState(0);
    if(rxdata1[4]==0xA8) m_led_grids.SetLedState(1);   
    else m_led_grids.SetLedState(0);
   

    rxflag=0;
    UpdateData(FALSE);
}
    CByteArray hexdata;
        int len1=String2Hex(kVINC,hexdata);
        m_ctrlComm.SetOutput(COleVariant(hexdata));
        kVINC="05 41 80 90 A0 B0 61 31 0D 00";            
}   
   

显示处理是这样的
2010-07-27 15:40
shanyue198
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-7-28
收藏
得分:0 
路过,学习学习···
2010-08-03 23:23
快速回复:请教一个串口编程问题啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031599 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved