0

我想与 C++ 中的电子负载通信。我使用win32.h。要将电子负载远程控制,我需要发送:

“AA 00 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CB”

但在发送之前,我需要将其转换为 ASCII 码。

我的代码是:

 HANDLE hCom;
 DWORD dwError;
 BOOL fSuccess;
 DWORD dwEvtMask;
 int i;
 int NbOctet;
 char *Message;
 unsigned long nBytesWrite;
LPCWSTR Port = L"COM14";
 Message = new char[200];
std::string Test;
/*-----------------------------------------------*/
/* Ouverture du port de communiucation           */
/*-----------------------------------------------*/

hCom = CreateFile(Port,
   GENERIC_READ | GENERIC_WRITE,
   0,
   NULL,
   OPEN_EXISTING,
   0,
   NULL
   );

Message = "AA 00 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CB";

NbOctet = strlen(Message);

WriteFile(hCom,Message,NbOctet,&nBytesWrite,NULL);


CloseHandle(hCom);


delete[] Message;

我的问题是:如何在发送之前将消息转换为 ASCII 字符?

我在 python 中有一个我想要的例子:

# Construct a set to remote command
cmd = chr(0xaa) + chr(0x00) + chr(0x20) # First three bytes
cmd += chr(0x01) + chr(0x00)*(length_packet - 1 - 4)
cmd += chr(CalculateChecksum(cmd))

sp.write(cmd)

我的新代码是:

void main(int argc, TCHAR *argv[])
{
 HANDLE hCom;
 DWORD dwError;
 BOOL fSuccess;
 DWORD dwEvtMask;
 int i;
 int NbOctet;
 unsigned long nBytesWrite;
 LPCWSTR Port = L"\\\\.\\COM14";

 /*-----------------------------------------------*/
 /* Ouverture du port de communiucation           */
 /*-----------------------------------------------*/

 hCom = CreateFile(Port,
   GENERIC_READ | GENERIC_WRITE,
   0,
   NULL,
   OPEN_EXISTING,
   0,
   NULL
   );

char Message[] = {0xAA,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCB};

NbOctet = strlen(Message);
qDebug() << Message;
WriteFile(hCom,Message,NbOctet,&nBytesWrite,NULL);


CloseHandle(hCom);

}

但它不起作用

4

2 回答 2

1

这可以通过std::ostringstream将单独的值转换为字符串并将std::stoi字符串解析为整数来完成:

std::ostringstream os("AA 00 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CB");

std::vector<uint8_t> values;

std::string value_string;
while (os >> value_string)
    values.push_back(static_cast<uint8_t>(std::stoi(value_string, nullptr, 16)));

WriteFile(hCom, values.data(), sizeof(uint8_t) * values.size(), &nBytesWrite, NULL);
于 2013-09-19T09:11:02.023 回答
0

如果您想使用十六进制,我根本不建议使用十六进制字符串。您可以改为执行以下操作:

char message_bytes[] = {0xAA, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00};
int message_length = 7; /* determine the size using either an argument or manually */

此外,您的打开文件功能将失败,因为当 COM 编号大于 9 时,您需要执行以下操作以使 Windows 识别它们:

LPCWSTR Port = L"\\\\.\\COM14";

本文所述


您没有正确设置 COM 端口,请考虑将DCBBuildCommDCB一起使用,然后使用SetcommState

DCB portConfig;
memset(&portConfig, 0, sizeof(portConfig));
portConfig.DCBlength = sizeof(portConfig);
/* 9600 baud, Even parity, 8 data bits, 1 stop bit */
BuildCommDCB(TEXT("9600,E,8,1"), &portConfig); 
SetCommState(hCom, &portConfig);

确保将端口设置为与硬件相同。请注意,虽然我没有包括错误检查,但我强烈建议您这样做。

于 2013-09-19T09:12:20.990 回答