我有一个代码,可以将HELLO WORLD:$从我的PC发送到COM6,再发送到TIVAC板。我已经通过IAR确认董事会收到了正确的信息。注意$是终止字符。
我已经在TIVAC板上设置了通过UART回显相同的消息,并通过Putty手动确认回显是正确的。但是,当使用以下发送相同消息并侦听echo的程序时,我会在echo中看到奇怪的字符,如图所示:
这可能是编码错误,但我该如何修复?

#include <string>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <iostream>
#include <winbase.h>
#include <tchar.h>

HANDLE GetSerialPort(char *);
void delay();
int main(void)
{
    //
    COMMTIMEOUTS timeouts;


    HANDLE h1;
    char h1_buffer[] = {"HELLO WORLD:$"};
    char h2_buffer[24];
    DWORD byteswritten, bytesread;
    char c1[] = {"COM6"};
    char c2[] = {"COM6"};
    h1 = GetSerialPort(c1);

    timeouts.ReadIntervalTimeout = 1;
    timeouts.ReadTotalTimeoutMultiplier = 1;
    timeouts.ReadTotalTimeoutConstant = 1;
    timeouts.WriteTotalTimeoutMultiplier = 1;
    timeouts.WriteTotalTimeoutConstant = 1;
    WriteFile(h1, h1_buffer, strlen(h1_buffer), &byteswritten, NULL);
    do
    {
        bool exit = FALSE;

        ReadFile(h1, h2_buffer, strlen(h2_buffer) + 1, &bytesread, NULL);

        if(bytesread)
        {
            h2_buffer[strlen(h2_buffer)] = '\0';
            std::string mystring(h2_buffer);
            std::cout << "String is  : " << mystring << "\n" ;
            printf("GOT IT %d\n", strlen(h2_buffer));
            ReadFile(h1, h2_buffer, strlen(h2_buffer) + 1, &bytesread, NULL);
            printf("%s\n", h2_buffer);
            printf("GOT IT %d\n", strlen(h2_buffer));
        }
        else
        {
            char stop;
            printf("Nothing read\n");
            printf("Do you want to exit? ");
            scanf(" %c", stop);
            if(stop == 'N' || stop == 'n')
            {
                exit = TRUE;
            }

        }
    }while(1);
    printf("EXIT ");
    CloseHandle(h1);
}
HANDLE GetSerialPort(char *p)
{
    HANDLE hSerial;
    hSerial = CreateFile(p,GENERIC_READ | GENERIC_WRITE, 0,0,OPEN_EXISTING,0, 0);

    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
    dcbSerialParams.BaudRate=CBR_115200;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;
    dcbSerialParams.fParity = 0;
    dcbSerialParams.ByteSize=DATABITS_8;
    dcbSerialParams.fDtrControl = 0;
    dcbSerialParams.fRtsControl = 0;

    return hSerial;
}
void delay ()
{
   int i = 1000000000;
   printf("In delay\n");
   while(i>0)
   {
       i--;
   }
}

最佳答案

代码中有很多问题。
对未初始化的内存调用strlen()将产生未定义的行为。
您不会检查WriteFile()调用是否有部分写入。
不检查ReadFile()上的返回值
对从strlen()收到的数据调用ReadFile(),而不是使用bytesread
等。
您不应该对从其他地方获得的数据使用strlen()——您应该检查您的数据并注意来自I/O调用的字节计数。

关于c++ - HELLO WORLD的COM串行端口回显中的奇怪字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29359813/

10-11 22:44