高手指点阿串口通信数据提取

作者&投稿:亢饱 (若有异议请与网页底部的电邮联系)
串口通信的一个问题,望高手指点一下,谢谢~

串口和中断的引脚重了。不解释,自己再翻翻书,这种问题不当面说不清的。

大哥,你好歹把编译出错信息复制上去吧~

//不懂的话再问我吧. 
//我给你一个我自己以前写的串口操作的函数,包括两部份,一部分主CPP文件,一部分为(头)H文件. 
//以下的代码在VC++6.0下测试通过. 
//将下面的两部分代码分别保存在serialport.cpp文件和serialport.h文件中. 
//最后面是一个简单的使用举例. 
//===========================SerialPort.cpp的开始========================= 
#include "SerialPort.h" 
HANDLE OpenSerialPort(string & strPort,ULONG ulBaudrate) 

    HANDLE hSerial; 
    hSerial = CreateFile((strPort.c_str()), 
            GENERIC_READ|GENERIC_WRITE, 
            NULL, 
            NULL, 
            OPEN_EXISTING, 
            NULL, 
            NULL); 
    if(hSerial == INVALID_HANDLE_VALUE)//Open serial port failed. 
    { 
        return hSerial; 
    }

    // Config serial port 
    DCB PortDCB; 
    PortDCB.DCBlength = sizeof(DCB); 
    
    // Get the default serial parameter. 
    GetCommState(hSerial, &PortDCB); 
    PortDCB.BaudRate = ulBaudrate; // baudrate 
    PortDCB.ByteSize = 8; // Number of bits/byte, 4-8 
    PortDCB.Parity = NOPARITY; 
    PortDCB.StopBits = ONESTOPBIT; 
    if (!SetCommState(hSerial, &PortDCB)) 
    { 
        //config the serial port failed. 
        CloseHandle(hSerial); 
        return (INVALID_HANDLE_VALUE); 
    } 
    
    //Config the serial port timeout property. 
    COMMTIMEOUTS CommTimeouts; 
    GetCommTimeouts(hSerial, &CommTimeouts);//Get the serial port default timeout. 
    CommTimeouts.ReadIntervalTimeout = MAXDWORD; 
    CommTimeouts.ReadTotalTimeoutMultiplier = 10; 
    CommTimeouts.ReadTotalTimeoutConstant = 10; 
    CommTimeouts.WriteTotalTimeoutMultiplier = 50; 
    CommTimeouts.WriteTotalTimeoutConstant = 100; 
    if (!SetCommTimeouts(hSerial, &CommTimeouts)) 
    { 
        //config the serial port timeout failed; 
        CloseHandle(hSerial); 
        return (INVALID_HANDLE_VALUE); 
    } 
    return (hSerial); 
}; 

void CloseSerialPort(HANDLE hSerial) 

    CloseHandle(hSerial); 
}; 

bool WriteSerial(BYTE *btData,ULONG ulSize,HANDLE hSerial) 

    DWORD dwNumBytes,dwRet; 
    dwRet=WriteFile (hSerial, //Handle 
                    btData, //Data buffer 
                    ulSize, //Buffer size 
                    &dwNumBytes, //written bytes 
                    NULL); //don't support 
    return (dwRet!=0); 
}; 

bool ReadSerial(BYTE *btData,ULONG *ulSize,HANDLE hSerial) 

    //SetCommMask (hSerial, EV_RXCHAR); 
    ULONG ulRdSize=0; 
    BYTE Byte; 
    DWORD dwBytes; 
    bool blRd=false; 
    DWORD dwMask=EV_RXCHAR; 
    //WaitCommEvent(hSerial,&dwMask,NULL); 
    SetCommMask (hSerial, EV_RXCHAR); 
    while (ReadFile(hSerial, &Byte, 1, &dwBytes, 0)!=0){ 
        if (dwBytes>0){ 
            btData[ulRdSize++]=Byte; 
            if (ulRdSize==*ulSize){ 
                blRd=true; 
                break; 
            } 
        }else{ 
            blRd=true; 
            break; 
        } 
    } 
    *ulSize=ulRdSize; 
    return (blRd); 
}; 
//===========================SerialPort.cpp的结束========================= 


//===========================SerialPort.H的开始========================= 
#include <windows.h> 
#include <string> 
using namespace std; 
HANDLE OpenSerialPort(string & strPort,ULONG ulBaudrate); 
void CloseSerialPort(HANDLE hSerial); 
bool WriteSerial(BYTE *btData,ULONG ulSize,HANDLE hSerial); 
bool ReadSerial(BYTE *btData,ULONG *ulSize,HANDLE hSerial); 
//===========================SerialPort.H的结束========================= 

//使用代码示例: 
HANDLE hSerialPort; 
hSerialPort = OpenSerialPort("COM1:",115200);//Open serial port com1 
if (hSerialPort != INVALID_HANDLE_VALUE) 

    if (!WriteSerial("HELLO!",7,hSerialPort))//Send data hello to com1 
        MessageBox(0,"ERROR","ERROR",MB_ICONWARNING);//show error message 
    CloseSerialPort(hSerialPort); 
}


+'0'明显是行不通的,他要送的是十六进制的数据。
while(1)
{
if(getch(&ch))
{
ch &= 0x0F;
if(ch < 10)
{
string[i] = ch + '0';
}
else if(ch < 16)
{
string[i] = ch + 'a';
}
i++;
}
}

假设有 short getch(char*) //若在缓冲取到输入值,则返回1

先回答一个问题~
如果接受到的是

01 0e 04 0f 12

你想得到什么数据~还是发送有约定~

byte Msg[5]={0x01,0x0e,0x04,0x0f,0x12};
char cBuf[255];//={'0'}
for(int i=0;i<sizeof(Msg);i++){
itoa(0x0f & Msg[i],&cBuf[i],16);
}
CString str(cBuf);
AfxMessageBox(str);

最终数据是什么格式的?
整型的就自己算
如果是ASCII的,将每个字节 + '0'


使用串口线连接不上设备
使用USB-RS232转串口线连接设备,笔记本上已经找到该串口(COM4)。通过console口还是连不上设备,这是什么原因。求解!!问题补充:使用的软件是CRT,现象:光标在CRT上面闪动,就是显示不出其他的字符。连接的是华为的交换机,S5300和S9306 yuan4qi | 浏览4568 次 |举报 我有更好的答案推荐...

POS机的小数点可以用哪个键代替
一台触摸屏,用手指触摸显示器屏幕后,局部地方无响应。[故障分析处理] 这有可能是触摸屏局部被硬物刮掉,将无法修复。5.触摸屏正常但电脑不能操作[故障现象] 一台触摸屏,经试验其本身一切正常,但接上主机后,电脑不能操作。[故障分析处理] 这有可能是在主机启动装载触摸屏驱动程序之前,触摸屏控制卡接收到操作信号...

MCS-51单片机在响应中断时,所有的中断标志都由内部硬件自动清零_百度...
并不是所有的中断标志都是硬件清0 的,对于外部中断而言,当触发方式为跳变触发时,中断标志为硬件清0.若触发方式为电平触发时,要软件进行清0.而对于定时器而言,定时器0和定时器1 的中断标志为硬件清0,定时器2中断标志需要软件进行清0.对于串口中断来说,也是需要软件请0 的,希望能帮到你,欢迎采纳。 本回答由提...

WinCC授权:运行项目时,总是提示许可证不全,求高手指教
采纳率:20% 来自团队:串口通信 擅长: 电脑\/网络 礼节礼仪 工程技术科学 唐山市 两性问题 其他回答 Automation License Manager服务没有启动,在360里面设置成开机启动就OK了 盛世VS教父 | 发布于2016-02-26 举报| 评论 3 0 我是把 1019 A9WSEC70 按上就好了 lvjuren4 | 发布于2015-01-09 举报| 评...

指纹门禁机如何使用
请放手指”。3、放手指时要注意,被采集者身体相对考勤机要站正。把从指尖开始2\/3位置指肚非常饱满的平放在采集器玻璃片上,不要滑动手指,轻轻用力按压,听到“嘀”的一声移开手指,同样进行第2次第3次按压,按压3次为采集了一枚完整的指纹。4、3次按压完成后,按【OK】保存。此时屏幕提示:‘...

什么是Ic3认证,具体考什么?
知道日报 全部文章 1678 掰手指会发出声音,你知道为什么... 精彩知识在知道 年终奖扣税的奥秘你知道吗? 百度知道精选审核官招募啦! “团结一新”2018年答题狂欢趴!× 个人、企业类侵权投诉 违法有害信息,请在下方选择后提交 类别 垃圾广告 低质灌水 色情、暴力 政治敏感 我们会通过消息、邮箱等方式尽快将举报...

VB中MSCOMM控件怎样实现接收到缓冲区中的数据就后先清空缓冲区再接下...
A)InputLen 属性,设置并返回 Input 属性从接收缓冲区读取的字符数。说明InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。B)Input 属性,返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。说明InputLen 属性确定被 Input 属性读取的...

我的企业一卡通只要一打开就显示打开串口失败,但是可以使用,到底是怎 ...
你的意思,是不是说打开软件,提示“打开串口失败”,如果这样的话,是因为你串口上没有接上机器。 来自:求助得到的回答 本回答由网友推荐 举报| 答案纠错 | 评论 3 0 wuhan0512 采纳率:41% 擅长: 生活常识 商业\/理财 武汉市 深圳市 其他回答 那可能是软件出错吧,不影响使用的就先用着吧,要不去咨询厂家 ...

单片机串口问题
估计是说printf函数本身是个空壳,真正要决定这个函数往哪里输出的就要自己定义输出的方向,比如这里printf是调用fputc函数输出的,而fputc函数是串口1输出,所以printf的输出方向就是串口。 本回答由提问者推荐 举报| 答案纠错 | 评论 5 0 ATF144X 采纳率:46% 来自:芝麻团 擅长: 工程技术科学 物理学 其他...

双辽市14735078676: 怎样一位一位的读取串口接收到的数据 -
姓胖易使: 一般要读取或设置串口数据都是一个字节一个字节的设置的,这个得符合串口通信的标准. 你可以告知一位一位读取的原因么,如果位之间没有太大关联,你可以用字节读出后,再解析位.

双辽市14735078676: 蓝牙设备 串口通讯 怎么获取实时数据 -
姓胖易使: 蓝牙串口实质上就是把可见的 传统串口连接线 变成了 不可见得 无线 传输(蓝牙). 举例:如果要使用单片机采集数据,通过蓝牙串口 发回 电脑端实时处理 1. 单片机 串口 TX 接蓝牙串口模块的RX, 单片机 RX 接到 蓝牙串口模块的TX 2. 电脑...

双辽市14735078676: 串口通讯解包数据 -
姓胖易使: 你做的和我做的差不多,你这个读取上来的数据,每四位代表一个含义,倒数四位应该是效验码,倒数第二个四位应该是转速,那么你把读取上来的数据拆开,方法有很多,比如字符串/附加字符串/搜索拆分字符串,只要四位转速1222,那么这个1222是十六进制的数据,然后使用字符串里面的十六进制字符串至数值转换将字符串转换成数值,你这个串口通讯我都做过,而且把读取上来的数据进行拆分转换是很容易的,有什么问题给我发消息,我电脑上有一个把读取上来的数据进行转换的,可以发给你看看

双辽市14735078676: 如何在串口通讯程序中处理数据包 -
姓胖易使: 每当串口缓冲区中有一个或一个以上字符时触发串口通讯事件,该事件就驱动(调用)串口事件通讯处理函数oncommunication(),在这里就可以对接收到的数据进行处理,提取需要的数据. 举两个例子,一个是较为简单的位数据格式的处理...

双辽市14735078676: VC++串口通信中怎么将串口收到的数据保存到文件中 -
姓胖易使: 使用一个子线程,使用一个队列,一边进另一边出,打开文件后写到文件里面就可以了.

双辽市14735078676: 如何读取串行通信数据 -
姓胖易使: 有 协议 分析 工具的 好像 价格 不菲 你 找找 看 其实,可以 试着 用 串口工具一类的 软件 试试 看 祝你顺利

双辽市14735078676: C++串口数据接收,如何把需要的数据提取出来?? -
姓胖易使: 串口的本质是一个个字符发的,所以你收到的时候有可能不是一个完整的字节.你可以一个个字符判断,收到完整的一行数据后进行处理.

双辽市14735078676: 如何通过串口读取plc的数据 -
姓胖易使: C#语言也带有串口通信控件的.只要把微软的串口通信控件添加进去,就可以简单的编程了.

双辽市14735078676: air怎么获取电脑串口数据 -
姓胖易使: 您好,如您所说以IPAD AIR为基准.首先,获取单片机和串口屏的通信协议; 其次,在PC中编写串口通信软件,分别控制两个设备即可; 调试的时候,可以先用现有的串口助手类软件如串口调试助手,或者自定义协议功能的通信软件如格西烽火,测试和验证你定义的协议. :山名人

双辽市14735078676: VB三种读取串口数据的方式 -
姓胖易使: 去百度文库,查看完整内容>内容来自用户:aQeC88QfPPHq53三种读取串口数据的方式目前通用的串口通讯的软件实现方式有3种,本文都进行详细的介绍,它们各有自身的优缺点,读者在编程时可根据具体的情况选择合适的方式.3.1利用...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网