开发者

Serial port: Read data problem with loopback, not reading anything

开发者 https://www.devze.com 2023-01-24 05:01 出处:网络
This problem has been asked many times, I read all the answers but still not able to figure out the problem.

This problem has been asked many times, I read all the answers but still not able to figure out the problem.

I have set up connection with COM1 port Wrote data to COM1 port using WriteFile Now I am trying to read data from the port using ReadFile but it is not reading anything. I have hard ware loopback the 2nd and 3rd of RS232 so that input can be read as output

#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  // hTem开发者_JAVA技巧plate 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);
}

The program is not returning any error code, but it continously waits to read data from COM1 port and never receives anything. I am stuck as I can't really decifer where the problem is. Any pointers will be helpful.

Thanks,

Yogesh


You are not doing anything obvious to set the hardware handshake signals. A serial port device almost always checks the RTS and DTR signals and won't send anything until they are active. Short from EscapeCommFunction to force them on, set the DCB.fDtrControl and fRtsControl members to turn on hardware handshaking.

Not setting the basic communication properties like baudrate, parity, databits and stopbits leaves you open to failure as well if the defaults are not appropriate or were changed by another program.

And do check that wiring is okay with a separate program like Putty or Hyperterminal.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号