【问题标题】:Serial port: Read data problem with loopback, not reading anything串口:环回读取数据问题,不读取任何内容
【发布时间】:2011-05-06 19:15:39
【问题描述】:

这个问题已经被问过很多次了,我看了所有的答案还是没能弄清楚问题所在。

我已建立与 COM1 端口的连接 使用 WriteFile 将数据写入 COM1 端口 现在我正在尝试使用 ReadFile 从端口读取数据,但它没有读取任何内容。 我有硬件环回 RS232 的第 2 和第 3,以便可以将输入读取为输出

#include <windows.h>
#include <stdio.h>
# include <tchar.h>


int main(int argc, char *argv[])

{

   DCB dcb;
   HANDLE hCom;
   BOOL fSuccess;
   char *pcCommPort = "COM3";

   hCom = CreateFile( _T("COM3"), //pcCommPort,
                    GENERIC_READ | GENERIC_WRITE,
                    0,    // must be opened with exclusive-access
                    0, // no security attributes
                    OPEN_EXISTING, // must use OPEN_EXISTING
                    FILE_ATTRIBUTE_NORMAL,    // not overlapped I/O
                    NULL  // hTemplate must be NULL for comm devices
                    );


   if (hCom == INVALID_HANDLE_VALUE) 
   {
      // Handle the error.
       printf ("CreateFile failed with error %d.\n", GetLastError());
      }

   // Build on the current configuration, and skip setting the size
   // of the input and output buffers with SetupComm.
   fSuccess = GetCommState(hCom, &dcb);

   if (!fSuccess) 
   {
     // Handle the error.
      printf ("GetCommState failed with error %d.\n", GetLastError());
   }

   dcb.BaudRate = 9600;     // set the baud rate
   dcb.ByteSize = 8;             // data size, xmit, and rcv
   dcb.Parity = NOPARITY;        // no parity bit
   dcb.StopBits = ONESTOPBIT;    // one stop bit

   fSuccess = SetCommState(hCom, &dcb);

   if (!fSuccess) 
   {
      // Handle the error.
      printf ("SetCommState failed with error %d.\n", GetLastError());
   }


   printf ("Serial port %s successfully reconfigured.\n", pcCommPort);

   char Buff[] = "Hello";
   char Buff2[50] = {};

   DWORD dwNumBytesWritten;
   DWORD dwBytesTransferred;

   printf("\n\n\n\n\n\n Start writting ! \n");

   WriteFile (hCom,              // Port handle
              Buff,              // Pointer to the data to write
              sizeof(Buff),                  // Number of bytes to write
              &dwNumBytesWritten, // Pointer to the number of bytes written
              NULL                    // Must be NULL for Windows Embedded CE
              );


            printf("\n Bytes Written to the terminal ");
            for( int j=0; j<dwNumBytesWritten; j++)
                 printf("%c",Buff[j]);


   printf("\n Byte length %d \n", dwNumBytesWritten);
   printf("\n\n\n\n\n\n Start reading !\n");

    ReadFile (hCom,                // Port handle
            Buff2,                // Pointer to data to read
            dwNumBytesWritten,     // Number of bytes to read
            &dwBytesTransferred,  // Pointer to number of bytes read
            NULL                  // Must be NULL for Windows Embeddded CE
            );


          for( int j=0; j<dwNumBytesWritten; j++)
                 printf("%c",Buff2[j]);

                 printf("\n BytesRead from the terminal:%d \n",dwBytesTransferred);

   CloseHandle(hCom);

   int num;
   scanf("%d", &num);
}

程序没有返回任何错误代码,但它一直在等待从 COM1 端口读取数据并且从未收到任何内容。我被困住了,因为我无法真正确定问题出在哪里。任何指针都会有所帮助。

谢谢,

瑜伽

【问题讨论】:

    标签: c windows winapi serial-port


    【解决方案1】:

    您没有做任何明显的事情来设置硬件握手信号。串行端口设备几乎总是检查 RTS 和 DTR 信号,并且在它们处于活动状态之前不会发送任何内容。短于 EscapeCommFunction 以强制它们打开,设置 DCB.fDtrControl 和 fRtsControl 成员以打开硬件握手。

    如果默认设置不合适或被其他程序更改,不设置基本通信属性(如波特率、奇偶校验、数据位和停止位)也会导致失败。

    使用 Putty 或 Hyperterminal 等单独的程序检查接线是否正常。

    【讨论】:

    • +1 建议使用 Putty 或 Hyperterminal 进行“健全性检查”。
    猜你喜欢
    • 2014-07-18
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多