XP中的串行通信:SetCommState需要一秒钟!救命! [英] Serial Comm in XP: SetCommState takes over one second! Help!

查看:67
本文介绍了XP中的串行通信:SetCommState需要一秒钟!救命!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

伙计,



我有一个模拟8051 comm协议的应用程序。这需要更改奇偶校验中间消息。第一个字节是唤醒字节,需要标记奇偶校验。在发送该字节后,需要将奇偶校验更改为空格以用于剩余的消息。



自Win98以来,自2000年以来一直运行良好,但我'我最近将应用程序移植到了XP。现在,似乎调用SetCommState,它发生在Wake-byte之后将奇偶校验更改为Space,大约需要1.5秒!此延迟会导致接收方忽略该消息。



代码段:



 静态 BOOL XmitPacket(BYTE * lpPacket)
{
BOOL fWriteOk;
BOOL fRcvdACK = FALSE;
int tries = 0 ;

// 保存我们正在寻找的Ack的价值
gDesiredTxAck = ACKBYTE(lpPacket [ 0 ]);

// 尝试发送数据包
执行
{

fWriteOk = CommWriter(& lpPacket [ 0 ], 1 );


if (!fWriteOk)
break ;

if (SetCommState(ghCommDev,& gdcbSpaceParity)== 0
{
AteError_WinSys( RCI:XmitPacket:SetCommState(gdcbSpaceParity) 0 );
break ;
}

fWriteOk = CommWriter(& lpPacket [ 1 ],lpPacket [ 1 ]);
睡眠( 40 ); // Pentium 4 CPU通信需求

if (SetCommState(ghCommDev,& gdcbMarkParity)== 0
{
AteError_WinSys( RCI:XmitPacket:SetCommState(gdcbMarkParity) 0 );
break ;
}

if (!fWriteOk)
break ;

睡眠( 40 );

//
// 然后,等待RCM发送Ack
//
if (WaitForSingleObject(ghSignalAckRcvd,gdwAckTimeoutPeriod)== WAIT_OBJECT_0)
fRcvdACK = TRUE;
} while (!fRcvdACK&&(++ tries< gXmitMaxRetries));

if (!fRcvdACK)
++ gXmitErrCounter;

return fRcvdACK;
}







Sysinternals Portmon的输出:

< pre lang =text>上午9:25:07 iGenATEB3.exe IRP_MJ_WRITE NiSerP1 SUCCESS长度1 :.
9:25:07 AM iGenATEB3.exe IOCTL_SERIAL_WAIT_ON_MASK NiSerP1 SUCCESS
9:25:07 AM iGenateB3.exe IOCTL_SERIAL_GET_BAUD_RATE NiSerP1 SUCCESS
9:25:07 AM iGenateB3.exe IOCTL_SERIAL_GET_LINE_CONTROL NiSerP1 SUCCESS
9:25:07 AM iGenATEB3.exe IOCTL_SERIAL_GET_CHARS NiSerP1 SUCCESS
9:25:07 AM iGenateB3.exe IOCTL_SERIAL_GET_HANDFLOW NiSerP1 SUCCESS
9:25:08 AM iGenateB3.exe IOCTL_SERIAL_SET_BAUD_RATE NiSerP1 SUCCESS率:38400
9:25:08 AM iGenATEB3.exe IOCTL_SERIAL_CLR_RTS NiSerP1 SUCCESS
9:25:09 AM iGenateB3.exe IOCTL_SERIAL_SET_LINE_CONTROL NiSerP1 SUCCESS StopBits:1奇偶校验:SPACE WordLength:8
9:25:09 AM iGenATEB3.exe IOCTL_SERIAL_SET_CHAR NiSerP1成功EOF:0错误:0 BRK:0 EVT:0 XON:11 XOFF:13
9:25:09 AM iGenATEB3.exe IOCTL_SERIAL_SET_HANDFLOW NiSerP1成功摇晃:52替换:0 XonLimit:2048 XoffLimit :512
9:25:09 AM iGenATEB3.exe IRP_MJ_WRITE NiSerP1 SUCCESS长度5:.....





来自这你可以看到在写入单个字节(9:25:07)和写入其余信息(9:25:09)之间已经过了1到2秒。



你们中的任何人都知道这里有什么?



TIA!

Jesse

解决方案

Folks,

I have an application that simulates an 8051 comm protocol. This requires changing the parity mid-message. The first byte is a Wake-up byte and needs Mark parity. After sending that byte, the parity needs to be changed to Space for the remainder of the message.

This has been working just fine since 2000 under Win98, but I've recently ported the app to XP. Now, it seems that the call to SetCommState, which occurs after the Wake-byte to change parity to Space, takes about 1.5 seconds! This delay causes the receiver to ignore the message.

Code snippet:

static BOOL XmitPacket (BYTE * lpPacket)
{
	BOOL fWriteOk;
	BOOL fRcvdACK = FALSE;
	int tries = 0;
	
	// save the value of the Ack we're looking for
	gDesiredTxAck = ACKBYTE (lpPacket[0]);

	// attempt to send the packet
	do
	{

		fWriteOk = CommWriter (&lpPacket[0], 1);


		if (!fWriteOk)
			break;
			
		if (SetCommState (ghCommDev, &gdcbSpaceParity) == 0)
		{
			AteError_WinSys ("RCI:XmitPacket:SetCommState (gdcbSpaceParity)", 0);
			break;
		}

		fWriteOk = CommWriter (&lpPacket[1], lpPacket[1]);
		Sleep(40); //need for Pentium 4  CPU communications
		
		if (SetCommState (ghCommDev, &gdcbMarkParity) == 0)
		{
			AteError_WinSys ("RCI:XmitPacket:SetCommState (gdcbMarkParity)", 0);
			break;
		}

		if (!fWriteOk)
			break;

	     Sleep(40);

		//
		// then, wait for the RCM to send an Ack
		//
		if (WaitForSingleObject (ghSignalAckRcvd, gdwAckTimeoutPeriod) == WAIT_OBJECT_0)
			fRcvdACK = TRUE;
	} while (!fRcvdACK && (++tries < gXmitMaxRetries));
	
	if (!fRcvdACK)
		++gXmitErrCounter;

	return fRcvdACK;
}




Output from Sysinternals Portmon:

9:25:07 AM	iGenATEB3.exe	IRP_MJ_WRITE	NiSerP1	SUCCESS	Length 1: .	
9:25:07 AM	iGenATEB3.exe	IOCTL_SERIAL_WAIT_ON_MASK	NiSerP1	SUCCESS		
9:25:07 AM	iGenATEB3.exe	IOCTL_SERIAL_GET_BAUD_RATE	NiSerP1	SUCCESS		
9:25:07 AM	iGenATEB3.exe	IOCTL_SERIAL_GET_LINE_CONTROL	NiSerP1	SUCCESS		
9:25:07 AM	iGenATEB3.exe	IOCTL_SERIAL_GET_CHARS	NiSerP1	SUCCESS		
9:25:07 AM	iGenATEB3.exe	IOCTL_SERIAL_GET_HANDFLOW	NiSerP1	SUCCESS		
9:25:08 AM	iGenATEB3.exe	IOCTL_SERIAL_SET_BAUD_RATE	NiSerP1	SUCCESS	Rate: 38400	
9:25:08 AM	iGenATEB3.exe	IOCTL_SERIAL_CLR_RTS	NiSerP1	SUCCESS		
9:25:09 AM	iGenATEB3.exe	IOCTL_SERIAL_SET_LINE_CONTROL	NiSerP1	SUCCESS	StopBits: 1 Parity: SPACE WordLength: 8	
9:25:09 AM	iGenATEB3.exe	IOCTL_SERIAL_SET_CHAR	NiSerP1	SUCCESS	EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
9:25:09 AM	iGenATEB3.exe	IOCTL_SERIAL_SET_HANDFLOW	NiSerP1	SUCCESS	Shake:52 Replace:0 XonLimit:2048 XoffLimit:512	
9:25:09 AM	iGenATEB3.exe	IRP_MJ_WRITE	NiSerP1	SUCCESS	Length 5: .....	



From this you can see between 1 and 2 seconds have elapsed between writing the single byte (at 9:25:07) and writing the rest of the message (at 9:25:09).

Any of you folks have an idea as to what's up here?

TIA!
Jesse

解决方案

这篇关于XP中的串行通信:SetCommState需要一秒钟!救命!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆