gpt4 book ai didi

c++ - HELLO WORLD 的 COM Serial Port echo 中的奇怪字符

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:11 30 4
gpt4 key购买 nike

我有代码可以将 HELLO WORLD:$ 从我的 PC 发送到 COM6 再到 TIVAC 板。我已通过 IAR 确认董事会收到了正确的信息。请注意,$ 是终止符。

我在 TIVAC 板上设置它以通过 UART 回显相同的消息,并通过 Putty 手动确认回显是正确的。但是,当使用以下发送相同消息并监听回声的程序时,我在回声中得到奇怪的字符,如图所示:

这可能是编码错误,但我该如何解决?

#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() 的返回值
  • 对从 ReadFile() 接收到的数据调用 strlen(),而不是使用 bytesread

你不应该像这样对从其他地方获得的数据使用 strlen()——你应该检查你的数据并注意来自你的 I/O 调用的字节数。

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com