首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

关于串口通讯有关问题

2012-02-09 
关于串口通讯问题!HANDLEhEvent0HANDLEhCom0DCBdcbOVERLAPPEDOverRead,OverWriteCOMSTATcomstatOVE

关于串口通讯问题!
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 试试

热点排行