vc串口通信如何按照协议读取接收数据

nlod123 2016-10-18 09:22:31
我用的serial port类写的串口通信,如果不解读其中的信息的话接收都没问题,但是想按照协议内容解读信息就出现问题,求大神指点啊!!!

LONG CTEST1Dlg::OnCommunication(WPARAM ch, LPARAM port)
//LONG CTEST1Dlg::OnComm(WPARAM ch, LPARAM port)
{

if(m_ctrlEditRXData.GetLineCount()>=15)
{
m_strEditRXData.Empty();
UpdateData(FALSE);
}
UpdateData(TRUE);
CString str;
CString strStatus;
int len;
int flag;
BYTE data[100];
m_strPortRXData += (char)ch;
str.Format("%02x",ch);
len=str.GetLength();
CString data1,data2,str11,;
long datastr[2];
char str1[100];
BYTE db1,db2;
datastr[1]=atoi(str.Mid(1,2));
itoa(datastr[1],str1,16);
db1=(BYTE)(Hex2ten(str[1])); //转十进制
db2=(BYTE)(Hex2ten(str[2]));
data1=dtob(db1); //转二进制
data2=dtob(db2);
if(data1[0]=='1')
state(IDC_STATIC0,0x0000FF00);
else
state(IDC_STATIC0,0xAAAAAAAA);

if(data1[1]=='1')
state(IDC_STATIC1,0x0000FF00);
else
state(IDC_STATIC1,0xAAAAAAAA);

if(data1[2]=='1')
state(IDC_STATIC2,0x0000FF00);
else
state(IDC_STATIC2,0xAAAAAAAA);

if(data1[3]=='1')
state(IDC_STATIC3,0x0000FF00);
else
state(IDC_STATIC3,0xAAAAAAAA);

if(data2[0]=='1')
state(IDC_STATIC4,0x0000FF00);
else
state(IDC_STATIC4,0xAAAAAAAA);

if(data2[1]=='1')
state(IDC_STATIC5,0x0000FF00);
else
state(IDC_STATIC5,0xAAAAAAAA);

if(data2[2]=='1')
state(IDC_STATIC6,0x0000FF00);
else
state(IDC_STATIC6,0xAAAAAAAA);

if(data2[3]=='1')
state(IDC_STATIC7,0x0000FF00);
else
state(IDC_STATIC7,0xAAAAAAAA);

m_strEditRXData += str;
UpdateData(FALSE);
return 0;
...全文
498 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-24
  • 打赏
  • 举报
回复
引用 9 楼 vcf_reader 的回复:
各位的回答很有意思 其实,这个已经不是编程的问题了,而是一个思维问题了。 好比你拿到一根很长的绳子,你要做的是在绳子上取出有用的那一截。 为了找到有用的部分,你得先做个记号。你找到记号,就找到了有用的部分。 串口通讯本质上跟这个是一个道理。仔细想想吧。
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
可爱的芒果酱 2016-10-23
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 使用一个FIFO,将读取和解读解耦。
串口是一个流式设备, 因此一包数据可能会分成N次接收到, 因此接收到的数据应该先缓存起来, 当数据达到或超过一包时,再从缓存中搜索和按协议解析, 解析成功后 丢弃成功及之前的缓存数据, 后续数据的任然留在缓存中,为下次接收和解析做准备 [/quote] 说得太好了,解答了我多年的困惑
vcf_reader 2016-10-22
  • 打赏
  • 举报
回复
各位的回答很有意思 其实,这个已经不是编程的问题了,而是一个思维问题了。 好比你拿到一根很长的绳子,你要做的是在绳子上取出有用的那一截。 为了找到有用的部分,你得先做个记号。你找到记号,就找到了有用的部分。 串口通讯本质上跟这个是一个道理。仔细想想吧。
赵4老师 2016-10-21
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
向立天 2016-10-21
  • 打赏
  • 举报
回复
你这代码不就是在解析么
zgl7903 2016-10-20
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
使用一个FIFO,将读取和解读解耦。
串口是一个流式设备, 因此一包数据可能会分成N次接收到, 因此接收到的数据应该先缓存起来, 当数据达到或超过一包时,再从缓存中搜索和按协议解析, 解析成功后 丢弃成功及之前的缓存数据, 后续数据的任然留在缓存中,为下次接收和解析做准备
nlod123 2016-10-20
  • 打赏
  • 举报
回复
引用 3 楼 xianglitian 的回复:
出什么问题?解析有问题还是读取有问题? 理论上解析数据和读取没有一点关系
恩,就是关于解析的问题, int head,head1,head2,head3,len; if(port=m_unPort) //串口处理事件 { len++; int x=0xAA; if((len==1)&&(x==ch)) { head=1; } else if(head==1) { int y=0xBB; if((len==2)&&(y==ch)) { head2=1; } else if(head2==1) { int z=0xCC; if((len==3)&&(z==ch)) { head3=1; } else if(head3==1) { m_strPortRXData=(char)ch; if(len==4) { head=0; head1=0; head2=0; len=0; // m_bRXDataReady=TRUE; } } else { if(ch!=0xAA) { head2=0; head=0; len=0; } else { head2=0; head=1; len=1; } } } else { if(ch!=0xAA) { head=0; len=0; } else { head=1; len=1; } } } else len=0; 这样判断完如何把需要的数据解析出来啊
nlod123 2016-10-20
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 使用一个FIFO,将读取和解读解耦。
串口是一个流式设备, 因此一包数据可能会分成N次接收到, 因此接收到的数据应该先缓存起来, 当数据达到或超过一包时,再从缓存中搜索和按协议解析, 解析成功后 丢弃成功及之前的缓存数据, 后续数据的任然留在缓存中,为下次接收和解析做准备 [/quote] 主要是现在我写的串口程序我已经可以接收到数据,只是我不会解析,比如我想把接收道德数据中的某一位提出来怎么写啊,我的数据都是16进制的
向立天 2016-10-19
  • 打赏
  • 举报
回复
出什么问题?解析有问题还是读取有问题? 理论上解析数据和读取没有一点关系
nlod123 2016-10-19
  • 打赏
  • 举报
回复
能不能具体给我说下,我是新手
赵4老师 2016-10-19
  • 打赏
  • 举报
回复
使用一个FIFO,将读取和解读解耦。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧