Я хочу общаться с электронной загрузкой на C++. Я использую win32.h. Для того, чтобы поставить электронную нагрузку в режиме дистанционного управления, мне нужно отправить:C++ Преобразование hexa в ASCII перед отправкой с последовательным портом
"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 carácter, прежде чем отправить его?
У меня есть пример в питоне того, что я хочу:
# 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);
}
Но это не работает
Строка '' AA 00 ... "' уже * есть * в ASCII. Символ '' A'' совпадает с целым значением '65'. Отправка этой строки будет отправлять значения ASCII «65 65 32 48 48» и т. Д. –
Кроме того, ваша программа содержит неопределенное поведение, поскольку вы выделяете память, затем * переписывайте * указатель (указывая на литеральную строку), поэтому «delete», скорее всего, сбой. –
А, вы хотите, чтобы вы пропустили каждое значение с разделителем в строке в виде шестнадцатеричного числа и отправили фактические цифры в виде целочисленных значений? –