writefile 句柄无效
场景:dll顶用串口WriteFile发数据时GetLastError()一直为6说是句柄无效
dll中用串口WriteFile发数据时GetLastError()一直为6说是句柄无效
上代码:
问题在代码中,请大侠指教,谢谢
------解决方案--------------------
初妈化g_hCom = INVALID_HANDLE_VALUE
//测试用例
if(g_hCom != INVALID_HANDLE_VALUE)
{
fState=WriteFile(g_hCom,g_buf,g_dwLength,&g_dwLength,&os);
.........
}
还有就是是g_hCom还是m_hCom
------解决方案--------------------
建议用现成的串口操作库,或者参考这个:
http://blog.****.net/wujian53/archive/2009/04/18/4090685.aspx
------解决方案--------------------
如果你是dll的中的话,全局变量应该
dll中用串口WriteFile发数据时GetLastError()一直为6说是句柄无效
上代码:
HANDLE _stdcall OpenConnection(int ipt)
{
HANDLE m_hCom;
COMMTIMEOUTS TimeOuts;
DCB dcb;
m_nBaud = 115200;
m_nDataBits = 8;
m_bEcho = FALSE;
m_bNewLine = FALSE;
m_nParity = 0;
m_sPort = "COM1";
m_nStopBits = 0;
char s[5]="";
sprintf(s,"COM%d",ipt);
m_hCom=CreateFile(s, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED,
NULL); // 重叠方式
if(m_hCom==INVALID_HANDLE_VALUE)
return 0;
SetupComm(m_hCom,4096,4096);
// 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
/* 设置写超时以指定WriteComm成员函数中的GetOverlappedResult函数的等待时间*/
TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(m_hCom, &TimeOuts);
if(!GetCommState(m_hCom, &dcb))
return 0;
dcb.fBinary=TRUE;
dcb.BaudRate = m_nBaud; // 数据传输速率
dcb.StopBits = ONESTOPBIT;//1停止位
dcb.ByteSize = m_nDataBits; // 每字节位数
dcb.Parity = NOPARITY; //////////无奇偶校验
if(!SetCommState(m_hCom, &dcb))
{
AfxMessageBox("Can not Set DCB");
return 0;
}
SetCommMask(m_hCom, EV_RXCHAR);
return m_hCom;
}
void CALLBACK CallBackFuncByFile(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2)
{
BOOL fState;
OVERLAPPED os = {0};
//测试用例
fState=WriteFile(g_hCom,g_buf,g_dwLength,&g_dwLength,&os);
if(!fState)
{
int i = GetLastError();//为什么返回一直是6???有的说os没有初始化,但我已经初始化了
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(g_hCom,&m_osWrite,&g_dwLength,TRUE);// 等待
}
else
g_dwLength=0;
}
if (g_count>2)
{
timeKillEvent(m_nTimerID);
}
g_count++;
return;
}
问题在代码中,请大侠指教,谢谢
------解决方案--------------------
初妈化g_hCom = INVALID_HANDLE_VALUE
//测试用例
if(g_hCom != INVALID_HANDLE_VALUE)
{
fState=WriteFile(g_hCom,g_buf,g_dwLength,&g_dwLength,&os);
.........
}
还有就是是g_hCom还是m_hCom
------解决方案--------------------
建议用现成的串口操作库,或者参考这个:
http://blog.****.net/wujian53/archive/2009/04/18/4090685.aspx
------解决方案--------------------
如果你是dll的中的话,全局变量应该
#pragma data_seg(".YourKey")
这个里面放入你的全局变量
#pragma data_seg()