当前位置: 代码迷 >> 单片机 >> 串口编程,该如何处理
  详细解决方案

串口编程,该如何处理

热度:52   发布时间:2016-04-28 15:03:18.0
串口编程
用函数WriteFile()写串口时总是写不进去,这是为什么呢?哪位大神指教一下,串口打开了,也初始化了
------解决方案--------------------
[b]


apiReturn _stdcall ConnectScanner(HANDLE *hScanner, char *szPort, int nBaudRate)
{
apiReturn ret=_OK;
//WORD gwHardVer;
//WORD gwSoftVer;

HANDLE hComm;

hComm = CreateFile( szPort,  
                    GENERIC_READ 
------解决方案--------------------
 GENERIC_WRITE, 
                    0, 
                    0, 
                    OPEN_EXISTING,
                    FILE_FLAG_OVERLAPPED,
                    0);
if (hComm == INVALID_HANDLE_VALUE)
return _init_rs232_err;

SetupComm(hComm, 0xFA00, 0xFA00);  //InQueueSize,OutQueueSize
    SetCommMask(hComm, 0); // disable events  

COMMTIMEOUTS  cto;
GetCommTimeouts(hComm, &cto);
    cto.ReadIntervalTimeout = 1000;
    cto.ReadTotalTimeoutMultiplier = 200 ;
    cto.ReadTotalTimeoutConstant = 2000 ;
    cto.WriteTotalTimeoutMultiplier = 200 ;
    cto.WriteTotalTimeoutConstant = 2000 ;
/*cto.ReadIntervalTimeout = 4;
    cto.ReadTotalTimeoutMultiplier = 2 ;
    cto.ReadTotalTimeoutConstant = 50 ;
    cto.WriteTotalTimeoutMultiplier = 20 ;
    cto.WriteTotalTimeoutConstant = 50 ;*/
if (!SetCommTimeouts( hComm, &cto))
{
CloseHandle(hComm);
return _init_rs232_err;
}

int BaudRate[]={115200,57600,38400,19200,9600};
int i;

DCB dcb;
GetCommState(hComm,&dcb);
if (nBaudRate==0)
dcb.BaudRate = 115200;
else
{
for (int i=0; i<9; i++)
if (nBaudRate==BaudRate[i])
break;
if (i>8)
return _baudrate_error;
dcb.BaudRate = nBaudRate;
}
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.Parity   = NOPARITY;    // 如果8位数据, 则必须无校验
if(!SetCommState(hComm, &dcb))
{
CloseHandle(hComm);
return _init_rs232_err;
}
 
PurgeComm(hComm, PURGE_TXCLEAR);  // flush transimition queue
PurgeComm(hComm, PURGE_RXCLEAR);  // flush receiveing queue
    
GetCommTimeouts(hComm, &cto);

GetCommTimeouts(hComm, &cto);

cto.ReadIntervalTimeout = 1000;
    cto.ReadTotalTimeoutMultiplier = 1000 ;
    cto.ReadTotalTimeoutConstant = 10000 ;
    cto.WriteTotalTimeoutMultiplier = 1000 ;
    cto.WriteTotalTimeoutConstant = 10000 ;
SetCommTimeouts( hComm, &cto);

*hScanner = hComm;
return _OK;
}
  相关解决方案