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

时间:2018-06-28 10:08:47

标签: c++ serial-port hex hyperterminal

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

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

#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("\n\n +==========================================+");
    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 Opened\n ", 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 Successfull\n");
        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("\n\n   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("\n\n    %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("\n\n   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("\n\n    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("\n\n    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("\n\n    ");
            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值,我希望在超级终端中读取该值。但是我得到一些垃圾值。我希望在超级终端中使用相同的十六进制值。

1 个答案:

答案 0 :(得分:0)

首先,您发送的只是数据。没有十进制或十六进制数据,您所拥有的只是二进制数据,即。 e。以字节为一组(通常为8组)存储的位。十进制或十六进制文字是一个值和相同(二进制)值的不同表示形式:

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

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

但是,如果您打算以人类可读格式表示任意二进制数据(如Intel HEX files一样),那么您将需要用两个char来表示每个数据字节,例如。 G。将包含ASCII值为78的包含“ N”的数据字节转换为'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;

旁注:您需要进行两次强制转换,以防止负数字符的符号扩展(至少在对char进行签名的情况下)。

是否应该使用有符号或无符号字符取决于要表示[-128; 127]或[0; 255]范围内的数据...