阅读:1498回复:14
急!!串口写不下去啊
HANDLE m_hComhandle;
//Open port m_hComhandle = CreateFile( "COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); DCB CommSettings; GetCommState(m_hComhandle,&CommSettings); CommSettings.DCBlength = sizeof(CommSettings); CommSettings.BaudRate = 9600; CommSettings.ByteSize = 8; CommSettings.Parity = 0; CommSettings.StopBits = 1; // CommSettings.fDsrSensitivity = 0; // CommSettings.fDtrControl = DTR_CONTROL_ENABLE; // CommSettings.fOutxDsrFlow = 0; SetCommState(m_hComhandle,&CommSettings); SetupComm(m_hComhandle,1024,1024); COMMTIMEOUTS timeouts; memset(&timeouts,0,sizeof(timeouts)); timeouts.ReadIntervalTimeout= MAXDWORD; timeouts.ReadIntervalTimeout=0; timeouts.ReadTotalTimeoutMultiplier=0; timeouts.ReadTotalTimeoutConstant=0; timeouts.WriteTotalTimeoutMultiplier=0; timeouts.WriteTotalTimeoutConstant=0; //write data DWORD dwWritten; char pWrBuf[] = "#00?T*"; DWORD nLen = strlen(pWrBuf); int nRet = 0 ; OVERLAPPED ov; memset(&ov,0,sizeof(ov)); ov.hEvent = CreateEvent( NULL,0,1,"writecom"); nRet = WriteFile(m_hComhandle,pWrBuf,nLen,&dwWritten,&ov); if (0 == nRet) { WaitForSingleObject(ov.hEvent ,INFINITE); } CloseHandle(ov.hEvent); //Colse port CloseHandle(m_hComhandle); 我得串口测试程序如上。可以得到串口句柄,但是dwWritten=0,就是写不下去。那位兄弟能帮忙看看。 串口没接任何东西,应该可以写下去的啊!! 谢谢! |
|
沙发#
发布于:2004-12-13 14:52
你用同步方式写串口试试
|
|
|
板凳#
发布于:2004-12-13 14:54
谢谢,我是新手。怎么设同步?
|
|
地板#
发布于:2004-12-13 14:58
如:
m_hComhandle = CreateFile( "COM2:", // 一定要有冒号 GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,// Be zero NULL); nRet = WriteFile(m_hComhandle,pWrBuf,nLen,&dwWritten,NULL); 你试试吧,祝你好运! [编辑 - 12/13/04 by wwei_wang] |
|
|
地下室#
发布于:2004-12-13 15:14
我查了一下资料,上面说windows CE不支持重叠I/O操作。
|
|
|
5楼#
发布于:2004-12-13 15:29
谢谢
|
|
6楼#
发布于:2004-12-13 15:43
kevin_hou兄弟,问题解决了吗?
|
|
|
7楼#
发布于:2004-12-13 16:21
写下去了,但读不上来数据。有时候可以,但重启后就又不行了。有个现成的软件,他先运行后在运行我得程序就可以度上来。为什么啊!!
|
|
8楼#
发布于:2004-12-13 16:26
你读串口数据的时候也不能用重叠I/O, 即lpOVERLAPPED=NULL。
你说“有个现成的软件”,是什么软件啊?能不能说得具体些。 |
|
|
9楼#
发布于:2004-12-13 16:35
// Read the data
COMSTAT CommStateInfo; unsigned long iErrorCode; DWORD dwRead; int nRet = 0 ; OVERLAPPED ovRead; memset(&ovRead,0,sizeof(ovRead)); ovRead.hEvent = CreateEvent( NULL,0,1,"readcom"); ClearCommError(m_hComhandle, &iErrorCode, &CommStateInfo); nLen = CommStateInfo.cbInQue; nRet = ReadFile(m_hComhandle,pData,nLen,&dwRead,NULL); CloseHandle(ovRead.hEvent ); 这是我得读串口程序,那个软件是国外的软件,只有应用程序。看不到里面的内容,谢谢兄弟。 |
|
10楼#
发布于:2004-12-13 16:36
// Read the data
COMSTAT CommStateInfo; unsigned long iErrorCode; DWORD dwRead; int nRet = 0 ; OVERLAPPED ovRead; memset(&ovRead,0,sizeof(ovRead)); ovRead.hEvent = CreateEvent( NULL,0,1,"readcom"); ClearCommError(m_hComhandle, &iErrorCode, &CommStateInfo); nLen = CommStateInfo.cbInQue; nRet = ReadFile(m_hComhandle,pData,nLen,&dwRead,NULL); CloseHandle(ovRead.hEvent ); 这是我得读串口程序,那个软件是国外的软件,只有应用程序。看不到里面的内容,谢谢兄弟。 CommStateInfo.cbInQue一直是0。 |
|
11楼#
发布于:2004-12-13 16:40
我觉得如果可能的话,你最好在驱动中设断点单步调试一下,查查问题究竟出在哪里?是出在应用与驱动的交互过程还是驱动与串口的交互过程。找到了原因,问题就容易解决了。
|
|
|
12楼#
发布于:2004-12-13 16:46
我单步跟踪到CommStateInfo.cbInQue=0,不知道问题在那?
|
|
13楼#
发布于:2004-12-14 08:58
kevin_hou兄弟,你是用两个串口调试的,一个发一个收?还是怎么调的?你能保证串口肯定有数据进来吗?
|
|
|
14楼#
发布于:2004-12-16 10:20
应该是这样的,在PC端上有个现成的程序,可以读,可以写,你自己在设备山也要写个程序,可以读,可以写,中间用cable线连起来,你的数据可以从你的AP写过去,但是从PC端写的数据你的AP读不出来,一般情况下,驱动中Tx,Rx很少有问题,主要就是你AP中读的那部分操作不行,你可以创建一个线程,一直循环读你的串口,在PC端一直向串口自动写数据(这个功能应该有吧),把这些数据写道文件里去,然后中止线程,看看有没有受到,要保证PC端一直有数据发过来
|
|