char * sendstring="hello world!";
char readstring[100];
unsigned long int len,fact_len,fact_send_len;
DCB dcb;
HANDLE hCom;
COMMTIMEOUTS timeout;
OVERLAPPED Write_OverLapped,Read_OverLapped;
len=fact_len=fact_send_len=0;
hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if( hCom == INVALID_HANDLE_VALUE )
{
ShowMessage( "串口打开失败" );
}
else
{
GetCommState(hCom, &dcb ) ; //读串口原来的参数设置
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity = NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(SetCommState(hCom,&dcb))
ShowMessage("OK"); SetupComm(hCom,1024,1024);
timeout.ReadIntervalTimeout=20;
timeout.ReadTotalTimeoutMultiplier=1000;
timeout.ReadTotalTimeoutConstant=1000;
timeout.WriteTotalTimeoutMultiplier=1000;
timeout.WriteTotalTimeoutConstant=1000;
SetCommTimeouts(hCom,&timeout);
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清干净输入、输出缓冲区
len=strlen(sendstring); bool fWriteState=WriteFile(hCom,sendstring,len,&fact_len,&Write_OverLapped);
if (!fWriteState) {
while(!GetOverlappedResult(hCom,&Write_OverLapped,&fact_send_len,true))
continue;
}
if(Write_OverLapped.hEvent!=NULL)
ShowMessage("发送完");
} CloseHandle(hCom);
------------------------
fact_send_len始终为0.
请问有什么错误?不要多线程.
char readstring[100];
unsigned long int len,fact_len,fact_send_len;
DCB dcb;
HANDLE hCom;
COMMTIMEOUTS timeout;
OVERLAPPED Write_OverLapped,Read_OverLapped;
len=fact_len=fact_send_len=0;
hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if( hCom == INVALID_HANDLE_VALUE )
{
ShowMessage( "串口打开失败" );
}
else
{
GetCommState(hCom, &dcb ) ; //读串口原来的参数设置
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity = NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(SetCommState(hCom,&dcb))
ShowMessage("OK"); SetupComm(hCom,1024,1024);
timeout.ReadIntervalTimeout=20;
timeout.ReadTotalTimeoutMultiplier=1000;
timeout.ReadTotalTimeoutConstant=1000;
timeout.WriteTotalTimeoutMultiplier=1000;
timeout.WriteTotalTimeoutConstant=1000;
SetCommTimeouts(hCom,&timeout);
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清干净输入、输出缓冲区
len=strlen(sendstring); bool fWriteState=WriteFile(hCom,sendstring,len,&fact_len,&Write_OverLapped);
if (!fWriteState) {
while(!GetOverlappedResult(hCom,&Write_OverLapped,&fact_send_len,true))
continue;
}
if(Write_OverLapped.hEvent!=NULL)
ShowMessage("发送完");
} CloseHandle(hCom);
------------------------
fact_send_len始终为0.
请问有什么错误?不要多线程.
解决方案 »
- 内核可使用的和 SetupDiGetClassDevs 功能类似的函数是什么?
- 延时问题
- 急问一个指针问题
- 请问怎么在在建立NT服务的时候通过main的命令行向其传递数据,
- 我是VC++的初学者,希望大家能给我提点捷径,少走点弯路。在这里谢大家了!
- 如何在VC中创建LOG文件???????
- 为什么要用Unicode?不用会有什么样的后果?
- 控制台程序中如何使用定时器?
- 可以不把窗口的style设置ws_popup而去掉窗口的标题栏吗???
- 怎样自动调用系统中发邮件的工具?(最好不要告诉我用第三方类,写个简单的函数就好了)
- 几行代码,急~~~~~~,在线结帖!!!
- 怎样获取IE内所有文本呢。只是要得到ie内能看到的文本。并不是html.
MemorySet(&write_overlapped,sizeof(write_overlapped);
HANLE hEvent = CreateEvent(NULL, FALSE, FALSE,"");
write_overlapped.hEvent = hEvent;
就可以了,呵呵,我也正在做这个,也是这个问题.
{
DWORD dwBytesWritten, dwBytesSent = 0;
OVERLAPPED os; memset(&os, 0, sizeof(os));
os.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(!WriteFile(m_hComm, lpstr, dwBytesToWrite,
&dwBytesWritten, &os)) {
if(GetLastError() == ERROR_IO_PENDING) {
while(!GetOverlappedResult(m_hComm, &os, &dwBytesWritten, TRUE)) {
if(GetLastError() == ERROR_IO_INCOMPLETE) {
dwBytesSent += dwBytesWritten;
continue;
}
else {
ShowError();
break;
}
}
dwBytesSent += dwBytesWritten;
if(dwBytesSent != dwBytesToWrite) {
CloseHandle(os.hEvent);
return false;
}
} else { //不是ERROR_IO_PENDING,出错
ShowError();
CloseHandle(os.hEvent);
return false;
}
} CloseHandle(os.hEvent);
return true;
}
if(Write_OverLapped.hEvent!=NULL)
//发送完
{
Read_OverLapped.hEvent=CreateEvent(NULL,true,NULL,NULL);
ReadFile(hCom,readstring,100,&fact_len,&Read_OverLapped);
while(!GetOverlappedResult(hCom,&Read_OverLapped,&fact_read_len,true))
continue; }