繁体   English   中英

串行通讯在C中不起作用

[英]Serial Communication not working in C

我正在尝试与通过USB转串行电缆制作的同事的板进行通信。 当我使用teraterm或腻子时,它可以正常工作,但是当我使用示例代码来完成时,它却无法正常工作。

由于我不知道如何执行此操作-至少在几年前,我还是最后一次这样做-我正在使用github中的一段代码: 使用Win32API进行Seerial编程

我知道,如果我发送命令:SB50G,则LED应该点亮。 但事实并非如此。 因此,我尝试查看它是否发回错误(如果出现任何错误,应发送'E'char)。 虽然什么也没收到。 然后,我尝试传输命令“ G”,该命令应返回8个十六进制的ASCII字符串。

除非同时使用Teraterm,否则打开端口时不会出现任何错误。

该代码是发送器和接收器示例的合并:

#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");
}

有人可以向我解释为什么它不起作用,或者以任何方式找出为什么它不起作用吗? 澳元汇率和应有的水平。

最好的祝福。

问题似乎是由于董事会造成的。 安装嗅探器后,我可以看到发送了正确的数据,但是没有返回任何信息。 显然,需要从数据中发送回车符,然后它才起作用。

非常感谢您的评论,我将认真考虑它们。 :)

暂无
暂无

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

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