各位高手,帮我一下,串口数据处理,在线.....(200分)

  • 主题发起人 主题发起人 rzqcjwrz
  • 开始时间 开始时间
9针5脚没接?你先做一个标准的7线替换他的线,看看他的DOS程序是否工作正常,
然后,再考虑监听的问题
 
能正常工作
 
我接线试一下,能否告诉我你的QQ号,我的QQ号:609174167
 
不能得到数据
 
楼上的朋友,对串口还是很了解的呀
9针串口 2---接收
3---发送
5---接地
可以直接监控本机的com1
需要程序可找我:qq:33586813 大家共同进步!
 
我觉得你接收的数据应该正确,不过他利用了RTS,可能你发送的时序不对,
转发程序不工作很可能同RTS有关,所以你的转发程序应该处理RTS信号,并
正确转发到另一个串口。
 
它的接法是:3-发送数据,4-数据终端准备,7-请求发送
 
如何编程
 
因为上下位机都是他自己写的,所以标准RS-232接口中的三个发送信号,即数据终端准备好DTR,请求发送RTS和发送数据TXD,转发程序都应该处理。如果可以的话,找个示波器看一
下最好。
 
我找不到示波器,在程序中如何编?
 
你找个一个可以设置RTS的串口调试工具,先设置 RTS,然后再发送数据看看金额显示器
是不是显示正常
 
用 BuildCommDCB,SetCommState
 
用 BuildCommDCB,SetCommState ,我用的是SPcomm控件,能否具体一点?
 
用SPCOMM我没操作过RTS,如果用API,在SetComState之后,就可以用
EscapeCommFunction来操作了。
 
spcomm一样,我将RTS设置为有效
 
//金额显示牌驱动
int com_flag = 0, overrun_flag, *error_code;
int com_port, fd1;
int thr, rbr, ier, lcr, mcr, lsr, msr; //串口控制寄存器地址
/*--------------------------------------------*/
/* COMMUNICATION FUNCTION */
void open_com(int Cport,int baud,int parity,int stopbits,int numbits,int *error_code )
{
int comdata; //串口控制寄存器数据
*error_code = 0;
//错误代码
com_port = Cport; //串口号
comdata = 0;
if ((numbits == 7) || (numbits == 8)) //数据位
comdata = comdata | (numbits-5) ;
else
*error_code = 5;
if ((stopbits == 2) || (stopbits == 1)) //停止位
comdata = comdata | (stopbits-1) << 2 ;
else
*error_code = 4;
if ((parity == 1) || (parity == 3) || (parity == 0)) //奇偶位校验
comdata = comdata | (parity << 3) ;
else
*error_code = 3;
switch (baud){ //波特率选择
case 110: comdata = comdata | 0x00;
break;
case 150: comdata = comdata | 0x20;
break;
case 300: comdata = comdata | 0x40;
break;
case 600: comdata = comdata | 0x60;
break;
case 1200: comdata = comdata | 0x80;
break;
case 2400: comdata = comdata | 0xA0;
break;
case 4800: comdata = comdata | 0xC0;
break;
case 9600 : comdata = comdata | 0xE0;
break;
default : *error_code = 2;
break;
}
if ((Cport <0) || (Cport >1 )) *error_code = 1;
//通信端口设置错误
if (*error_code == 0)
bioscom( 0,comdata,Cport); //初始化串口控制寄存器
if(Cport == 0) {
thr = 0x3f8;
rbr = 0x3f8;
ier = 0x3f9;
lcr = 0x3fb;
mcr = 0x3fc;
lsr = 0x3fd;
msr = 0x3fe;
}
else
{
thr = 0x2f8;
rbr = 0x2f8;
ier = 0x2f9;
lcr = 0x2fb;
mcr = 0x2fc;
lsr = 0x2fd;
msr = 0x2fe;
}
inp(lsr);
/*Reset any pending errors*/
inp(rbr);
/*Read any pending character*/
*error_code = 0;
/*Set error code to 0*/
com_flag = 1;
overrun_flag = 0;
/*Set overrun flag to false */
}
void send_com(int date, int *error_code)
{
int handshake;
long counter;
if (com_flag == 0)
*error_code = 10;
else
{
counter = 0;
handshake = 0x00;
do {
counter += 1;
delay(1);
} while ((((inp(msr) &amp;
handshake) != handshake) ||
((inp(lsr) &amp;
0x20) != 0x20)) &amp;&amp;
(counter < TIMEOUT));
if (counter == TIMEOUT) *error_code = 8;
else
{
outp(thr,date); //输出数据
*error_code = 0;
}
}
}
void InitComm()
{
if(HW_LEDFLAG) {
open_com(HW_LEDPORT,1200,ODD,1,8,error_code);
}
}
void DispFee(int cartype, int money)
{
char tmpstr[3], tmpstr1[2];
int tmpint;
itoa(money, tmpstr, 10);
tmpstr1[0] = tmpstr[0];
tmpint = atoi(tmpstr1);
send_com(tmpint, error_code);
tmpstr1[0] = tmpstr[1] ;
tmpint = atoi(tmpstr1);
send_com(tmpint, error_code);
send_com(cartype,error_code);
}
void ClearLEDFee()
{
send_com(0, error_code);
send_com(0, error_code);
send_com(0, error_code);
}
能否写成delphi程序,用spcomm控件
 
有些看不明白,能否解释一下?
 
找一个串口(商店有卖2、3块一个)将2,3脚短接。再找一个串口控件,或者串口监视软件就可以得到所有的控制数据,不需要接其他设备,数据绝对准确,其中可能有一个字节是用来完成奇偶校验的,要注意,比如它发8个字节,就会再发一个字节作为前8个字节的奇偶校验位。
 
你都有代码了,还费什么劲?![:(]
如果这段代码是正确的,你找个串口调试器试试吧
1200,奇校验,8位数据,1位停止位
看到DSR变化了就发送数据
 
关键我对C不太熟悉,能帮否?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部