由于原来的554扩展串口驱动在接收的时候总是多接收一个字符,这个多的字符是前面接收中一个。如果发送“w”,那么就会接收到“ww”,如果发送“ws”,那么接收到的就是“wsw”或者“wss”(后者的情况要多一些)。由于是现成的.dll文件没有办法改,所以只有重新用我原来自己portting的代码自己编译一个554扩展串口的驱动了。
为了方便以及由于时间问题,就用了 [url]http://www.cnemb.com/forum/read.php?tid=23015[/url](gerryzhou大侠提供的代码)。谁知道问题很奇怪,中断没有问题,接收和发送都可以,但是都只有乱码,不过也乱得有点规律。接收:如果pc发送字母(a,b,c之类的)就接收到0x80,如果是数字或者标点符号那就是0。发送:不管发送什么,pc接收的都是0xFF。
经过多处打探,最后还经过gerryzhou大侠的提示:bautrate和晶震的问题。
原来的配置如下:
#define BAUD_SER_TABLE_SIZE 11
static const PAIRS SER_BaudPairs[BAUD_SER_TABLE_SIZE] = {
{50, 4608},
{1200, 192},
{2400, 96},
{9600, 24},
{14400, 16},
{19200, 12},
{38400, 6},
{57600, 4},
{76800, 3},
{115200, 2},
{230400, 1}
};
通过反汇编以前的.dll文件得到如下数据:
.text:10001020 dword_10001020 DCD 0x32, 0x4818, 0x4B, 0x3010, 0x6E, 0x20C8, 0x87, 0x1AD0
.text:10001020 ; DATA XREF: .text:100010DCo
.text:10001020 DCD 0x96, 0x1808, 0x12C, 0xC00, 0x258, 0x600, 0x4B0, 0x300
.text:10001020 DCD 0x708, 0x200, 0x7D0, 0x1D0, 0x960, 0x180, 0xE10, 0x100
.text:10001020 DCD 0x12C0, 0xC0, 0x1C20, 0x80, 0x2580, 0x60, 0x3200, 0x48
.text:10001020 DCD 0x3840, 0x40, 0x4B00, 0x30, 0x5A00, 0x28, 0x7080, 0x20
.text:10001020 DCD 0x9600, 0x18, 0xE100, 0x10, 0x1C200, 8, 0x17
.text:100010DC DCD dword_10001020
哈哈,对照一下就清楚了。0x1C200 == 115200
修改完SER_BaudPairs中的数据,一切都可以正常工作了。