如何插入十六进制值并发送到串口?

How to insert hex value and send to serial port?

本文关键字:并发 串口 十六进制 何插入 插入      更新时间:2023-10-16

下面是我的代码。我想发送十六进制值并在超级终端中以十六进制形式获取输出。我不确定如何发送它。

我在超级终端输出中得到了一些垃圾值。它正在读取但不发送十六进制输出。

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdint.h>
#define    BUFFERLENGTH 256

int main(void)
{
HANDLE hComm;                          // Handle to the Serial port
char ComPortName[] = "\\.\COM6"; // Name of the Serial port(May Change) to be opened,
BOOL   Status;
DWORD dwEventMask;                     // Event mask to trigger
unsigned char TempChar;             // Temperory Character
char  SerialBuffer[256];               // Buffer Containing Rxed Data
DWORD NoBytesRead;                     // Bytes read by ReadFile()
int i = 0;

printf("nn +==========================================+");
printf("n |  Serial Communication (Win32 API)         |");
printf("n +==========================================+n");
/*----------------------------------- Opening the Serial Port --------------------------------------------*/
hComm = CreateFile(ComPortName,                       // Name of the Port to be Opened
GENERIC_READ | GENERIC_WRITE,      // Read/Write Access
0,                                 // No Sharing, ports cant be shared
NULL,                              // No Security
OPEN_EXISTING,                     // Open existing port only
0,                                 // Non Overlapped I/O
NULL);                             // Null for Comm Devices
if (hComm == INVALID_HANDLE_VALUE)
printf("n   Error! - Port %s can't be opened", ComPortName);
else
printf("n   Port %s Openedn ", ComPortName);

/*------------------------------- Setting the Parameters for the SerialPort ------------------------------*/
DCB dcbSerialParams = { 0 };                        // Initializing DCB structure
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
Status = GetCommState(hComm, &dcbSerialParams);     //retreives  the current settings
if (Status == FALSE)
printf("n   Error! in GetCommState()");
dcbSerialParams.BaudRate = CBR_9600;      // Setting BaudRate = 9600
dcbSerialParams.ByteSize = 8;             // Setting ByteSize = 8
dcbSerialParams.StopBits = ONESTOPBIT;    // Setting StopBits = 1
dcbSerialParams.Parity = EVENPARITY;      // Setting Parity = None 
Status = SetCommState(hComm, &dcbSerialParams);  //Configuring the port according to settings in DCB 
if (Status == FALSE)
{
printf("n   Error! in Setting DCB Structure");
}
else
{
printf("n   Setting DCB Structure Successfulln");
printf("n       Baudrate = %d", dcbSerialParams.BaudRate);
printf("n       ByteSize = %d", dcbSerialParams.ByteSize);
printf("n       StopBits = %d", dcbSerialParams.StopBits);
printf("n       Parity   = %d", dcbSerialParams.Parity);
}
/*------------------------------------ Setting Timeouts --------------------------------------------------*/
while (1)
{
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 5000;
timeouts.ReadTotalTimeoutConstant = 5000;
timeouts.ReadTotalTimeoutMultiplier = 1000;
timeouts.WriteTotalTimeoutConstant = 5000;
timeouts.WriteTotalTimeoutMultiplier = 1000;
if (SetCommTimeouts(hComm, &timeouts) == FALSE)
printf("n   Error! in Setting Time Outs");
else
printf("nn   Setting Serial Port Timeouts Successfull");
printf("n |---------  Serial Communication (Win32 API) --------|");
printf("Starting to write......");
//char   lpBuffer[] = "ABC";               // lpBuffer should be  char or byte array, otherwise write wil fail
uint8_t message[15];
message[0] = 0x16;
message[1] = 0x16;
message[2] = 0x02;
message[3] = 0x01;
message[4] = 0x07;
message[5] = 0x08;
message[6] = 0x00;
message[7] = 0xFF;
message[8] = 0xFF;
message[9] = 0x01;
message[10] = 0x00;
message[11] = 0x01;
message[12] = 0x00;
message[13] = 0xFF;
message[14] = 0xFF;
//byte(bytestosend)[15] = { message[0], message[1], message[2], message[3], message[4], message[5], message[6], message[7], message[8], message[9],message[10], message[11],message[12], message[13], message[14] };
DWORD  dNoOFBytestoWrite;              // No of bytes to write into the port
DWORD  dNoOfBytesWritten = 0;          // No of bytes written to the port
dNoOFBytestoWrite = sizeof(message); // Calculating the no of bytes to write into the port
Status = WriteFile(hComm,               // Handle to the Serialport
message,            // Data to be written to the port 
dNoOFBytestoWrite,   // No of bytes to write into the port
&dNoOfBytesWritten,  // No of bytes written to the port
NULL);
if (Status == TRUE)
printf("nn    %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X- Written to %s", message[0], int(message[1]), int(message[2]), int(message[3]), int(message[4]), int(message[5]), int(message[6]), int(message[7]), int(message[8]), int(message[9]), int(message[10]), int(message[11]), int(message[12]), int(message[13]), int(message[14]), ComPortName);
else
printf("nn   Error %d in Writing to Serial Port", GetLastError());

int k;
for (k = 0; k < 50; k++)
{
printf("");
}

/*-----------------------------------Read --------------------------------------------*/

int l;
for (l = 0; l < 50; l++)
{
printf("");
}

printf("nn    Waiting for Data Reception");
dwEventMask = 1;
//Status = WaitCommEvent(hComm, &dwEventMask, NULL); //Wait for the character to be received
/*-------------------------- Program will Wait here till a Character is received ------------------------*/
if (Status == FALSE)
{
printf("n    Error! in Setting WaitCommEvent()");
}
else //If  WaitCommEvent()==True Read the RXed data using ReadFile();
{
printf("nn    Characters Received");
do
{
//byte(TempChar)[15] = { message[0], message[1], message[2], message[3], message[4], message[5], message[6], message[7], message[8], message[9],message[10], message[11],message[12], message[13], message[14] };
//if(! ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, NULL))
if (!ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, NULL))
///*    ReadFile(
//      _In_ HANDLE hFile,
//      _Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,
//      _In_ DWORD nNumberOfBytesToRead,
//      _Out_opt_ LPDWORD lpNumberOfBytesRead,
//      _Inout_opt_ LPOVERLAPPED lpOverlapped
//  );*/
//if (!ReadFile(hComm, SerialBuffer, BUFFERLENGTH, &NoBytesRead, NULL))
{
printf("wrong character" );
}
//printf("/n /n %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X", int(TempChar[0]), int(TempChar[1]), int(TempChar[2]), int(TempChar[3]), int(TempChar[4]), int(TempChar[5]), int(TempChar[6]), int(TempChar[7]), int(TempChar[8]), int(TempChar[9]), int(TempChar[10]), int(TempChar[11]), int(TempChar[12]), int(TempChar[13]), int(TempChar[14]));
SerialBuffer[i] = TempChar;
//printf("%X is the read", SerialBuffer[i]);
i++;
} while (NoBytesRead > 0);
/*------------Printing the RXed String to Console----------------------*/
printf("nn    ");
int j = 0;
for (j = 0; j < i - 1; j++)     // j < i-1 to remove the dupliated last character
printf("%X are the values read", SerialBuffer[j]);
}
}
CloseHandle(hComm);//Closing the Serial Port
printf("n ==========================================n");
_getch();
}

我将其作为输入 16 16 02 01 07 08 FF FF 01 00 01 00 FF FF 值,我希望在超级终端中读取相同的值。但是我得到了一些垃圾值。我希望在超级终端中使用相同的十六进制值。

一开始:你发送的只是数据。没有十进制或十六进制数据这样的东西,您所拥有的只是二进制数据,即存储在(通常(8 个字节组中的位。十进制或十六进制文本只是相同(二进制(值的不同表示形式:

char a[] = { 0x61, 0x62, 0x63, 0 };
char b[] = {   97,   98,   99, 0 };

ab现在将包含完全相同的值,如果解释为 ASCII 字符,则会发生这些值以表示字符串"abc"...

但是,如果您打算以人类可读的格式表示任意二进制数据(如英特尔十六进制文件(,则需要将每个数据字节表示两个char秒,例如,将包含"N"(ASCII 值为 78(的数据字节转换为'4', 'e'的字节序列或'4', 'E'个。

但是,这将使您的通信开销加倍,因此我仅在收到数据才会进行转换:

std::vector<char> received = readFromSerial();
// assuming arbitrary data..
for(auto c : received)
std::cout << std::setfill('0') << std::hex << std::setw(2)
<< static_cast<unsigned int>(static_cast<unsigned char>(c)) << std::endl;

旁注:您需要双强制转换以防止负字符的符号扩展(至少在字符有符号的情况下(。

是否应该首选有符号或无符号字符取决于您是否要表示 [-128;127] 或 [0;255]分别...