大佬教程收集整理的这篇文章主要介绍了c – 使用WriteFile / ReadFile的Serial Comm,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
//#include "StdAfx.h" #include <stdio.h> #include <windows.h> #include <winbase.h> #include <iostream> #include <tchar.h> using namespace std; int main() { int com = 'COM2'; String data = "\n 010400 \n"; char output[32]; //unsigned int length = 0; DCB config = {0}; bool abConTinue = true; DWORD dwBytesWritten; DWORD dwBytesRead; int isRead = false; HANDLE m_hCommPort = ::CreateFile(L"COM2",GENERIC_READ|GENERIC_WRITE,//access ( read and writE) 0,//(sharE) 0:cAnnot share the COM port 0,//security (NonE) OPEN_EXISTinG,// creation : open_exisTing 0,// we dont want overlapped operation 0// no templates file for COM port... ); config.DCBlength = sizeof(config); if((GetCommState(m_hCommPort,&config) == 0)) { printf("Get configuration port has a problem."); return falSE; } config.baudRate = 9600; config.StopBits = OnesTOPBIT; config.Parity = PARITY_NONE; config.byteSize = DATABITS_8; config.fDtrControl = 0; config.fRtsControl = 0; if (!SetCommState(m_hCommPort,&config)) { printf( "Failed to Set Comm State Reason: %d\n",GetLastError()); //return E_FAIL; } printf("Current SetTings\n Baud Rate %d\n Parity %d\n Byte Size %d\n Stop Bits %d",config.baudRate,config.Parity,config.byteSize,config.StopBits); int isWritten = WriteFile(m_hCommPort,&data,(DWORD) sizeof(data),&dwBytesWritten,null); //memset(output,sizeof(output)); while (abConTinuE) { isRead = ReadFile(m_hCommPort,output,sizeof(output),&dwBytesRead,null); if(!isRead) { abConTinue = false; break; } } cin.get(); }
我在从com端口读取时遇到问题.如果我单步执行代码,它将进入“isRead = ReadFile(m_hCommPort,& dwBytesRead,null);”并且没有回来……这是我第一次尝试这个没有成功.
COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = 1; timeouts.Read@R_487_10586@lTimeoutMultiplier = 1; timeouts.Read@R_487_10586@lTimeoutConstant = 1; timeouts.Write@R_487_10586@lTimeoutMultiplier = 1; timeouts.Write@R_487_10586@lTimeoutConstant = 1; if (!SetCommTimeouts(m_hCommPort,&timeouts)) // setTing timeouts Failed.
编辑:也许更容易从一些有效的代码开始,并使它做你想做的,而不是试图让你的代码工作.这是一个简单的终端程序.它极端极简,但确实有效(至少足以让我看到GPS的输出,例如).从任何人(最不重要的是我)称之为复杂的方面来说,这是一个漫长的道路,但至少应该给出一些如何开始的想法.
#include <stdio.h> #include <conio.h> #include <String.h> #define StriCT #define WIN32_LEAN_AND_MEAN #include <windows.h> void system_error(char *Name) { // Retrieve,format,and print out a message from the last error. The // `name' that's passed should be in the form of a present tense noun // (phrasE) such as "opening file". // char *ptr = NULL; Formatmessage( FORMAT_messaGE_ALLOCATE_BUFFER | FORMAT_messaGE_FROM_SYstem,GetLastError(),(char *)&ptr,1024,null); fprintf(stderr,"\nError %s: %s\n",name,ptr); LocalFree(ptr); } int main(int argc,char **argv) { int ch; char buffer[1]; HANDLE file; COMMTIMEOUTS timeouts; DWORD read,written; DCB port; HANDLE keyboard = GetStdHandle(STD_INPUT_HANDLE); HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE); DWORD mode; char port_name[128] = "\\\\.\\COM3"; char init[] = ""; // e.g.,"ATZ" to completely reset a modem. if ( argc > 2 ) sprintf(port_name,"\\\\.\\COM%c",argv[1][0]); // open the comm port. file = CreateFile(port_name,GENERIC_READ | GENERIC_WRITE,NULL,OPEN_EXISTinG,null); if ( INVALID_HANDLE_VALUE == filE) { system_error("opening file"); return 1; } // get the current DCB,and adjust a few bits to our liking. memset(&port,sizeof(port)); port.DCBlength = sizeof(port); if ( !GetCommState(file,&port)) system_error("getTing comm state"); if (!BuildCommDCB("baud=19200 parity=n data=8 stop=1",&port)) system_error("building comm DCB"); if (!SetCommState(file,&port)) system_error("adjusTing port setTings"); // set short timeouts on the comm port. timeouts.ReadIntervalTimeout = 1; timeouts.Read@R_487_10586@lTimeoutMultiplier = 1; timeouts.Read@R_487_10586@lTimeoutConstant = 1; timeouts.Write@R_487_10586@lTimeoutMultiplier = 1; timeouts.Write@R_487_10586@lTimeoutConstant = 1; if (!SetCommTimeouts(file,&timeouts)) system_error("setTing port time-outs."); // set keyboard to raw reading. if (!GetConsoleMode(keyboard,&modE)) system_error("getTing keyboard mode"); mode &= ~ ENABLE_PROCESSED_INPUT; if (!SetConsoleMode(keyboard,modE)) system_error("setTing keyboard mode"); if (!EscapeCommFunction(file,CLRDTR)) system_error("clearing DTR"); Sleep(200); if (!EscapeCommFunction(file,SETDTR)) system_error("setTing DTR"); if ( !WriteFile(file,init,sizeof(init),&written,NULL)) system_error("wriTing data to port"); if (written != sizeof(init)) system_error("not all data written to port"); // basic terminal loop: do { // check for data on port and display it on screen. ReadFile(file,buffer,sizeof(buffer),&read,null); if ( read ) WriteFile(screen,read,null); // check for keypress,and write any out the port. if ( kbhit() ) { ch = getch(); WriteFile(file,&ch,1,null); } // until user hits ctrl-BACkspace. } while ( ch != 127); // close up and go home. CloseHandle(keyboard); CloseHandle(filE); return 0; }
以上是大佬教程为你收集整理的c – 使用WriteFile / ReadFile的Serial Comm全部内容,希望文章能够帮你解决c – 使用WriteFile / ReadFile的Serial Comm所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。