有一问题已经扰我很长时间了:关于串口问题?急!!!

DongBeiXiNan 2004-04-11 03:31:40
有一问题已经扰我很长时间了:
1 我编的程序用WIN API调用串口串口与交换机通信(手工维护太累)
2 必须先用其他工具使用串口并关闭后,我的程序才可通过串口进行通信,否则阻塞不可写读。
3 程序中DCB已设置正确
4 若用串口控件就不会出现上述问题
...全文
8 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangnanonnet 2004-04-12
你试试一下的打开串口方式

ZComm::open(char *szPort,int Baud_rate, BOOL overlapped)
{
int retbuflength=0;

if (overlapped) { //异步方式打开串口
memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;
memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ;

READ_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (READ_OS.hEvent == NULL) return -1 ;

WRITE_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (NULL == WRITE_OS.hEvent)
{
CloseHandle( READ_OS.hEvent ) ;
return -1 ;
}

idComDev=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL );

olap=TRUE;
} //同步方式打开串口
else idComDev=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
0, //is overlapped or no
NULL );

if (idComDev==(HANDLE) -1){

DWORD RR=GetLastError();
CloseHandle(idComDev) ;
if (olap){
CloseHandle( READ_OS.hEvent ) ;
CloseHandle( WRITE_OS.hEvent ) ;
}
fCOMMOpened=0;
olap=FALSE;
return (0);
}

set_baudrate(Baud_rate);
fCOMMOpened=1;
SetupComm(idComDev,11520,2048);
PurgeComm(idComDev, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
SetCommMask(idComDev,EV_RXCHAR/* EV_RXFLAG*/ );
//set time out
SetTimeOut(10,100,500);
return (1);
}

BOOL ZComm::SetTimeOut(DWORD ReadIntervalTimeout,
DWORD ReadTotalTimeoutMultiplier,
DWORD ReadTotalTimeoutConstant)
{
COMMTIMEOUTS timeouts;

GetCommTimeouts(idComDev,&timeouts);
timeouts.ReadIntervalTimeout=ReadIntervalTimeout;
timeouts.ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier;
timeouts.ReadTotalTimeoutConstant=ReadTotalTimeoutConstant;
return SetCommTimeouts(idComDev,&timeouts);
}

ZComm::Close()
{
if (fCOMMOpened==1) {
fCOMMOpened=0;
CloseHandle(idComDev) ;
olap=FALSE;
if (olap){
CloseHandle( READ_OS.hEvent ) ;
CloseHandle( WRITE_OS.hEvent ) ;
}
return 1;
}
return 0;
}

int ZComm::set_baudrate(int baud_rate)
{
DCB dcb;
BOOL fsuccess;

fsuccess = GetCommState(idComDev, &dcb);
if (!fsuccess) return 0;

dcb.BaudRate =baud_rate;
dcb.ByteSize =8; //number of bits/byte, 4-8
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
//dcb.EvtChar=0x02;
//dcb.fNull=TRUE;

fsuccess=SetCommState(idComDev, &dcb);
if (!fsuccess) return 0;

return 1;
}
回复
Sander 2004-04-12
Show your sourcecode.
回复
rwdx 2004-04-12
看看你的代码,
回复
DongBeiXiNan 2004-04-12
to zhangnanonnet(鱼欢) :
不行,read读出的是空格,write不起作用。
是否与其他工具应用通讯握手协议有关。
回复
DongBeiXiNan 2004-04-11
关闭了
回复
basboy 2004-04-11
你的程序每次打开了串口以后关闭句柄了吗
回复
发动态
发帖子
硬件/系统
创建于2007-09-28

2590

社区成员

VC/MFC 硬件/系统
申请成为版主
社区公告
暂无公告