系统:S3C2440 + WINCE5.0
目的:使用S3C2440的COM2与外部设备的串口通信。
过程
(1)先使用WINCE中的串口调试器,固定用115200发送50个16进制的协议字节;
(2)外部设备正确接收到协议字节后,会回送120个字节;
出现的问题:
WINCE中串口调试器发送完50个字节后,收到了外部设备回送的字节,但是实际只收到104个,发现协议开头的20个字节丢了,多了4个未知字节,从第21个字节到协议尾巴的校验位前第119个字节都是正确的,校验位却是有时候正确,有时候错误。这是怎么回事?
如果物理线路有问题,那么我ARM发出去的数据应该也有问题,外部设备就不可能正确响应协议数据了,但收到的数据中正确的数据占了82%,是否这可排除物理线路;
我在串口驱动pdds3c2440_ser.cpp,函数
ULONG CPdd2440Uart::ReceiveInterruptHandler(PUCHAR pRxBuffer,ULONG *pBufflen) 接收部分
if (DataReplaced(&uData,(uLineStatus & UERSTATE_PARITY_ERROR)!=0))
{
*pRxBuffer++ = uData;
ReceiveBuffer[ReceiveBufIndex++] = uData; // 增加了一个缓冲,在COM1中打印用于观察接收到的数据
dwRoomLeft--;
dwBytesStored++;
}
所得结果也是上面的描述问题,那是否能说ARM接收数据时是没问题的,那问题出在哪呢?传输过程中???
请大虾们指点指点啊,多谢了!!!
自带串口都出现这个?而且前面数据被截断。这个真不知道了。
我后面被截断就做过。
你这个问题需要自己写个串口应用,步步为营,调试。
good luck
问题找到了
因为外部设备的特殊性,TxD与RxD是连在一起的,所以我在函数CPdd2440Uart::XmitInterruptHandler()中增加了处理,发送前,把RxD1管脚重置为GPIO功能的输入,发送后关闭TxD1,再打开RxD1。问题就在这里,对功能管脚的重新配置在函数 Rx_Pause(FALSE) 的前面,我发完数据后,对RxD1重复操作了,外部设备响应回送字节时,前面字节就丢失了。
但是又有了新问题:
回送的120个协议字节中,每次都在相同的位置出现了相同的误码(有8个错误的字节),这是怎么回事呢?如果称为误码,那为什么每次都在相同的位置出现相同的错误字节呢?为什么不是在随机的位置出现不同的错误字节呢?这难道会是电路板干扰的问题吗?(板子是自己画的,第一次画这种高速板 -_-!)