简体   繁体   English

串行通讯在C中不起作用

[英]Serial Communication not working in C

I'm trying to communicate with a board a colleague made via a USB To serial cable. 我正在尝试与通过USB转串行电缆制作的同事的板进行通信。 It works fine when I use teraterm or putty, but I can't get it to work, when I do it with a sample code. 当我使用teraterm或腻子时,它可以正常工作,但是当我使用示例代码来完成时,它却无法正常工作。

Since I have no idea how to do this - or at least a couple of years ago I did it last - I'm using a piece of code from github: Seerial Programming with Win32API 由于我不知道如何执行此操作-至少在几年前,我还是最后一次这样做-我正在使用github中的一段代码: 使用Win32API进行Seerial编程

I know that if I transmit the command: SB50G, an LED should light up. 我知道,如果我发送命令:SB50G,则LED应该点亮。 But it doesn't. 但事实并非如此。 So I tried to see, if it sends an error back (It should send an 'E' char in case of any error). 因此,我尝试查看它是否发回错误(如果出现任何错误,应发送'E'char)。 Though nothing is received. 虽然什么也没收到。 I then tried to transmit the command 'G', which should return a an ASCII string of 8 hex'es. 然后,我尝试传输命令“ G”,该命令应返回8个十六进制的ASCII字符串。

I don't get any errors upon opening the port, unless I use it in teraterm at the same time. 除非同时使用Teraterm,否则打开端口时不会出现任何错误。

The code is a merge of the transmitter and receive example: 该代码是发送器和接收器示例的合并:

#include <Windows.h>
#include <stdio.h>
#include <string.h>
void main(void)
{

    HANDLE hComm;                          // Handle to the Serial port
    char  ComPortName[] = "\\\\.\\COM3";  // Name of the Serial port(May Change) to be opened,
    BOOL  Status;                          // Status of the various operations 
    DWORD dwEventMask;                     // Event mask to trigger
    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 Transmission (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_19200;      // Setting BaudRate = 9600
    dcbSerialParams.ByteSize = 8;             // Setting ByteSize = 8
    dcbSerialParams.StopBits = ONESTOPBIT;    // Setting StopBits = 1
    dcbSerialParams.Parity = NOPARITY;      // 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);
    }

    Status = SetCommMask(hComm, EV_RXCHAR); //Configure Windows to Monitor the serial device for Character Reception

    if (Status == FALSE)
        printf("\n\n    Error! in Setting CommMask");
    else
        printf("\n\n    Setting CommMask successfull");


    /*------------------------------------ Setting Timeouts --------------------------------------------------*/

    COMMTIMEOUTS timeouts = { 0 };

    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;

    if (SetCommTimeouts(hComm, &timeouts) == FALSE)
        printf("\n   Error! in Setting Time Outs");
    else
        printf("\n\n   Setting Serial Port Timeouts Successfull");


    /*----------------------------- Writing a Character to Serial Port----------------------------------------*/
    char   lpBuffer[] = "G\r";             // lpBuffer should be  char or byte array, otherwise write wil fail
    DWORD  dNoOFBytestoWrite;              // No of bytes to write into the port
    DWORD  dNoOfBytesWritten = 0;          // No of bytes written to the port

    dNoOFBytestoWrite = sizeof(lpBuffer); // Calculating the no of bytes to write into the port

    Status = WriteFile(hComm,               // Handle to the Serialport
        lpBuffer,            // 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    %s - Written to %s", lpBuffer, ComPortName);
    else
        printf("\n\n   Error %d in Writing to Serial Port", GetLastError());


    /*------------------------------------ Setting WaitComm() Event   ----------------------------------------*/

    printf("\n\n    Waiting for Data Reception");

    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
        {
            Status = ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, NULL);
            SerialBuffer[i] = TempChar;
            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("%c", SerialBuffer[j]);

    }

    CloseHandle(hComm);//Closing the Serial Port
    printf("\n +==========================================+\n");
}

Can someone explain to me why it's not working, or any way I can find out why it's not working? 有人可以向我解释为什么它不起作用,或者以任何方式找出为什么它不起作用吗? The BAUD-rate and such are as they should be. 澳元汇率和应有的水平。

Best regards. 最好的祝福。

The problem seemed to be due to the board. 问题似乎是由于董事会造成的。 After installing a sniffer, i could see the correct data being sent out, but nothin was returned. 安装嗅探器后,我可以看到发送了正确的数据,但是没有返回任何信息。 Apparently the carriage return needed to be send separat from the data, and then it worked. 显然,需要从数据中发送回车符,然后它才起作用。

Many thanks for the comments, I'll take them in to serious consideration. 非常感谢您的评论,我将认真考虑它们。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM