发表于:2005-04-01 15:03:00
楼主
win98, vc6,
我的程序中需要在两台PC多个串口异步通信,pc标准串口com1不够用,选用MOXA公司的 smartio c104h/pci异步通信卡
因某种特别需要,程序中只能使用_oup和_inp直接操作端口。(强调:不允许使用api函数以及其他通信控件!郁闷!)
读取串口数据时使用查询方法,不允许使用中断。
在通信测试时却发现如下问题:
1) 如果用MOXA卡上的任意两个端口,可以发现通信正常,能正确收发数据。
可是一旦改为MOXA卡的一个端口(如port1)和PC机的标准串口COM1通信,就出现错误,虽然能够接收到数据,
但数据全是错误的(强调:端口的基地址已经配置正确,线路连接正确)。
2) 当使用MOXA卡的一个串口和PC机的标准串口COM1通信时,如果采用别的程序检验串口通信情况(例如,使用网上
下载的串口调试助手、或是用串口控件之类写的应用程序),就会发现通信是正常的,能够正确收发数据。
3) 虽然从上面步骤可以初步判断是程序有问题,可是把上面的程序复制到另外一台机器上(该机器也是WI98,也有同样的moxa通信卡),
试验发现:在两台机器的moxa卡之间(例如pc1上MOXA卡的port1端口和pc2上MOXA卡的port1端口)能正常通信,能正确收发数据。
下面是程序的主要片断:
//定义端口基地址
//#define base2 0x03f8 //pc机标准串口COM1基地址
#define base1 0xdd00 //MOXA卡PORT1基地址
#define base2 0xdd08 //MOXA卡PORT2基地址
//#define base3 0xdd10 //MOXA卡PORT3基地址
//#define base4 0xdd18 //MOXA卡PORT4基地址
//根据不同的通信需要,选择不同的通信端口时,配置不同的端口基地址
//初始化
//MOXA卡port1初始化
_outp(base1+3, 0x80);
_outp(base1+0, 0x06); //波特率为19200
_outp(base1+1, 0x00);
_outp(base1+3, 0x03); //LCR 8个数据位,1 个停止位, 无校验位
_outp(base1+1, 0x00);
_outp(base1+1, 0x00); //不使用中断控制
_outp(base1+2, 0x00); // FCR enable transmitter and receiver FIFOS
_outp(base1+2,0xc0);
_outp(base1+4, 0x00);
_outp(base1+2,0x07); //清空FIFO
_outp(base1+2,0x01);
//另外一个通信端口的初始同上,只是基地址根据具体情况略有变化
//开始异步传输数据
{
_outp(base1+2,0x07); //清空FIFO
_outp(base1+2,0x01);
//for(i=0;i<=3;i++)
_outp(base1, 0x09); //发送数据,可以只发一个字节也可多发多个
//接收数据如下
int status=0;
{
status=_inp(base2+5);
while((status&1)!=1){
status=_inp(base2+5);
}
MessageBox("data received");
data[0]=_inp(base2);
str.Format("%d %d",data[0],status);
MessageBox(str);
}
}
上面的发送数据和接收数据程序片断可以放在一个按钮的单击事件中,串口接线正确后,单击按钮就能看到上述现象。