Code Bye

C++串口通信收到的数据有一部分乱码

谁能给本人个纯C++ API函数(不用MFC框架生成)写的串口通信程序呢?包含把收到的字符正确显示到屏幕上的。本人之前写的接收程序,用串口助手发字符,接收后cout输出总是有乱码,不知道中间怎么处理就不会出现乱码了?
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE hMutex;
  
DWORD WINAPI Read(LPVOID lpParamter)
{   
    //打开端口
    HANDLE hCom = CreateFileA("com7", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
    //设置超时
    COMMTIMEOUTS timeouts;
    GetCommTimeouts(hCom, &timeouts);
    timeouts.ReadIntervalTimeout = 0;
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 1;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant = 0;
    if (!SetCommTimeouts(hCom, &timeouts))
    {
        cout<<"超时设置失败!重新";
        CloseHandle(hCom);
        return 0;
    }
  
    //取得并设置端口状态
    DCB dcb;
    GetCommState(hCom, &dcb);
    dcb.DCBlength = sizeof(DCB);
    dcb.BaudRate = 9600;
    dcb.Parity = 0;  
    dcb.ByteSize = 8;
    dcb.StopBits = ONESTOPBIT;   
    if (!SetCommState(hCom, &dcb))
    {
        cout<<"端口状态设置失败!重新";
        CloseHandle(hCom);
        return 0;
    }
  
  
    char buffer[1024];
    DWORD readsize,dwError; 
    BOOL bReadStatus;
    COMSTAT cs;
  
    WaitForSingleObject(hMutex, INFINITE);
    while(1)
    {   
        readsize = 0;
        ClearCommError(hCom,&dwError,&cs);//取得状态
        //数据能否大于所准备缓冲区
        if(cs.cbInQue>sizeof(buffer))
        {
            PurgeComm(hCom,PURGE_RXCLEAR);//清除通信端口数据
            return 0;
        }
        memset(buffer, 0 , sizeof(buffer));
        bReadStatus = ReadFile(hCom, buffer, cs.cbInQue, &readsize, 0);
        if(readsize>0)
            {
                cout<<cs.cbInQue;
                buffer[cs.cbInQue]="\0";
                std::cout<<buffer;
            }
        Sleep(5);
    }
    ReleaseMutex(hMutex);
    CloseHandle(hCom);
}
  
void main()
{
    HANDLE hThread = CreateThread(NULL, 0, Read, NULL, 0, NULL);
    hMutex = CreateMutex(NULL, FALSE, NULL);
    CloseHandle(hThread);
    while(1)
        Sleep(1000); 
}
解决方案

10

http://blog.127n.com/post/6.html

10

引用:

波特率够低了,是9600的。用十六进制将数据打出来?就是cout<<hex<<a或printf(“%x”,a)么?

void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,”%08x -“,i+addr);
sprintf(binstr,”%s %02x”,binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,”%s %02x”,binstr,(unsigned char)buf[i]);
sprintf(binstr,”%s  “,binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,”%s%c”,binstr,(“!”<buf[j]&&buf[j]<=”~”)?buf[j]:”.”);
}
printf(“%s\n”,binstr);
} else {
sprintf(binstr,”%s %02x”,binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,”%s   “,binstr);
}
sprintf(binstr,”%s  “,binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,”%s%c”,binstr,(“!”<buf[j]&&buf[j]<=”~”)?buf[j]:”.”);
}
printf(“%s\n”,binstr);
}
}

10

对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

10

乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符!
但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。
摒弃cin、cout!
使用scanf、printf。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++串口通信收到的数据有一部分乱码