2013-09-19 2 views
0

Я хочу общаться с электронной загрузкой на 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); 

} 

Но это не работает

+0

Строка '' AA 00 ... "' уже * есть * в ASCII. Символ '' A'' совпадает с целым значением '65'. Отправка этой строки будет отправлять значения ASCII «65 65 32 48 48» и т. Д. –

+0

Кроме того, ваша программа содержит неопределенное поведение, поскольку вы выделяете память, затем * переписывайте * указатель (указывая на литеральную строку), поэтому «delete», скорее всего, сбой. –

+1

А, вы хотите, чтобы вы пропустили каждое значение с разделителем в строке в виде шестнадцатеричного числа и отправили фактические цифры в виде целочисленных значений? –

ответ

0

Если вы хотите использовать hex, я бы не рекомендовал использовать шестнадцатеричные строки вообще. Вы можете сделать следующее вместо:

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 вам нужно сделать следующее для окон, чтобы признать их:

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

Как описано в This Article


Вы arn't настройки вашего COM-порт должным образом, рассмотреть возможность использования DCB с BuildCommDCB и то и петь 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); 

Убедитесь, что вы установите порт, чтобы быть таким же, как ваше оборудование. Обратите внимание, что, хотя я не включил проверку ошибок, я настоятельно рекомендую вам это сделать.

+0

Вы почти забыли ответить на вопрос. – IInspectable

+0

@Inspectable Я ответил на вопрос, сказав: «Не делайте этого, используйте этот метод вместо этого», я не думаю, что его следует поощрять использовать метод, который он использует. – Serdalis

+0

Благодарю вас за ответ, я пытаюсь применить ваши советы в своем коде, но он не работает снова. Я поставил свой новый код в вопрос – boboch

1

Это может быть сделанный с помощью std::ostringstream, чтобы получить отдельные значения в строках, и std::stoi для синтаксического анализа строки как целочисленной er:

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); 
+0

Это хороший фрагмент кода !Но я не думаю, что его следует поощрять к тому, чтобы идти по этому пути, чего он хочет. – Serdalis

+0

@ Сердалис Почему бы и нет? – 0x499602D2

+0

@ 0x499602D2 Если нет необходимости представлять сообщение в этом формате, этот метод довольно расточительный и далеко не стандартный способ передачи сообщения в COM-порт. Очевидно, что OP только начинает использовать COM-порты, поэтому лучше всего давать ему хорошие привычки. – Serdalis

Смежные вопросы