你这该死的串口(2)

      由于原来的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中的数据,一切都可以正常工作了。

你可能感兴趣的:(职场,串口,休闲)