关于串口通讯问题!
HANDLE hEvent=0;
HANDLE hCom=0;
DCB dcb;
OVERLAPPED OverRead, OverWrite;
COMSTAT comstat;
OVERLAPPED os;
DWORD dwEvtMask=0;
//---------------------------------------
//初始化串口
int __stdcall InitCom(int port,int baud)
{
AnsiString comname;
comname= "COM "+IntToStr(port);
CloseHandle(hCom);
COMMTIMEOUTS CommTimeOuts;
if(hCom==INVALID_HANDLE_VALUE)
{
switch (GetLastError())
{
case ERROR_FILE_NOT_FOUND: MessageBox(NULL, "串口不存在! ", "提示信息 ",NULL );
break;
case ERROR_ACCESS_DENIED: MessageBox(NULL, "串口已被占用! ", "提示信息 ",NULL);
break;
}
return 0;
}
if(hCom!=0)
{
return 0;
}
hCom=CreateFile(comname.c_str(), //文件名
GENERIC_READ|GENERIC_WRITE,//访问模式允许读写
0, //此项必须是0
NULL,//无安全参数
OPEN_EXISTING,//创建方式
FILE_FLAG_OVERLAPPED,//异步工作方式
NULL);
if(hCom==INVALID_HANDLE_VALUE)
{
ShowMessage( "打开串口失败! ");
return 0;
}
if(!GetCommState(hCom,&dcb)) //获得串口设置并用它填充dcb结构体
{
ShowMessage( "获得串口设置失败! ");
return 0;
}
if(!SetupComm(hCom,1024,512)) //设置输入输出缓冲区大小
{
ShowMessage( "设置输入输出缓冲区大小失败! ");
return 0;
}
//设置dcb结构成员变量
dcb.BaudRate=baud;
dcb.fParity=0;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
dcb.ByteSize=8;
dcb.fNull=FALSE;
dcb.fInX=true;
dcb.fOutX=true;
dcb.XonLim=1;
dcb.XoffLim=1;
dcb.fRtsControl=RTS_CONTROL_DISABLE;
if(!SetCommState(hCom,&dcb)) //重新配置串口
{
ShowMessage( "配置串口失败! ");
return 0;
}
//获取串行口超时参数
GetCommTimeouts(hCom,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF;
CommTimeOuts.WriteTotalTimeoutConstant=5000;
if(!SetCommMask(hCom,EV_RXCHAR))
{
ShowMessage( "设置事件掩码失败! ");
return 0;
}
SetCommTimeouts(hCom,&CommTimeOuts); // 设置超时
memset(&OverRead,0,sizeof(OVERLAPPED));
memset(&OverWrite,0,sizeof(OVERLAPPED));
OverRead.hEvent=CreateEvent(NULL,true,false,NULL);
OverWrite.hEvent=CreateEvent(NULL,true,false,NULL);
OverWrite.Offset=0;
OverWrite.OffsetHigh=0;
}
//向串口写数据
void __fastcall Sendsms(void* chStr,,unsigned long StrLen)
{
unsigned long Written ;
BOOL WriteState=WriteFile(hCom,
chStr,
StrLen,
&Written
&OverWrite);
if((!WriteState || StrLen!=Written) && (GetLastError()==ERROR_IO_PENDING))
{
//ShowMessage( "错误! ");
}
}
//-----------------------------------------
为什么总是不能向串口写入(AT命令)数据呢?请指点一下,谢谢!
[解决办法]
__stdcall ??
[解决办法]
全部改成__fastcall 试试