Programming 版 (精华区)
发信人: JJason (总统~~), 信区: Programming
标 题: [合集]求救:关于TC2.0串口通讯的问题
发信站: 哈工大紫丁香 (2003年03月20日16:57:42 星期四), 站内信件
────────────────────────────────────────
id (communication) 于 Wed Jan 8 20:23:03 2003) 说道:
代码如下:
#include "dos.h"
#include "bios.h"
/* 常数定义 */
#define PORT 0 /* 通信口,0表示串口com1 */
#define TRUE 1
#define FALSE 0
#define TIMEOUT 0x8000 /* 超时 */
#define BREAKDET 0x1000 /* 间断 */
#define FRAMERR 0x800 /* 数据帧错 */
#define PARERR 0x400 /* 奇偶校验错 */
#define OVERERR 0x200 /* 超越错 */
#define RCVDRDY 0x100 /* 接收就绪 */
#define B2400 0xA0 /* BPS=2400 */
#define NONE 0x00 /* 无奇偶校验 */
#define SB1 0x00 /* 1位停止位 */
#define DB8 0x03 /* 8位数据位 */
unsigned SerInit(int,unsigned char);
unsigned SerSend(int,unsigned char);
unsigned SerRecv(int);
unsigned SerStat(int);
void Tty(unsigned char);
unsigned char breakon;
void interrupt (*oldhandle)();
void interrupt ctrlbreak(void) {
breakon=1; }
int main(void) {
unsigned int key;
unsigned char ch;
int res=0;
oldhandle=getvect(0x1b);
breakon=0;
setvect(0x1b,ctrlbreak);
res=SerInit(PORT,B2400+DB8+SB1+NONE); /* 初始化串口,波特率2400 */
while(TRUE) {
if(breakon) break;
if(bioskey(1)) {
key=bioskey(0);
if(key & 0xff) {/* 发送普通字符 */
res=SerSend(PORT,key);
if( res & TIMEOUT) {
printf("Time out !\n");
break;}
}
}
res=SerStat(PORT);
if(res & RCVDRDY) {
key=SerRecv(PORT);
if(key &(BREAKDET | FRAMERR | PARERR | OVERERR)) {
if(key & BREAKDET) printf("Detect BREAK.\n");
if(key & FRAMERR) printf("Error:FRAME.\n");
if(key & PARERR) printf("Error:PARITY.\n");
if(key & OVERERR) printf("Error:OVERRUN.\n");
break; }
ch=key; /* 把key的低8位赋给char型ch */
Tty(ch);
}
} /* while */
setvect(0x1b,oldhandle);
getchar();
return 0;
} /* main */
unsigned SerInit(int port,unsigned char config) {
return (bioscom(0,config,port)); }
unsigned SerSend(int port,unsigned char ch){
return (bioscom(1,ch,port)); }
unsigned SerRecv(int port) {
return (bioscom(2,0,port)); }
unsigned SerStat(int port) {
return (bioscom(3,0,port)); }
void Tty(unsigned char ch) {
union REGS r;
r.h.ah=0x0e;
r.h.al=ch;
r.h.bh=0;
r.h.bl=0x07;
int86(0x10,&r,&r);
}
运行时老在res=SerSend(PORT,key)处出错,即程序返回值为Time out错误,
怎么回事???
windows me,tc 2.0,串口正常(已用其他程序测试过),通信时用9针插头,
把2-3直接短接,没有接地线。
────────────────────────────────────────
sogao (立交) 于 Thu Jan 9 13:42:38 2003) 说道:
只是扫了下你的程序,串口1不是0C中断吗,怎么是1B那,再有建议你将地线连起来,我们
所有的232都是三线制
────────────────────────────────────────
id (communication) 于 Thu Jan 9 15:09:51 2003) 说道:
不是,程序采用查询方式运行,中断1B是捕捉ctrl+break的,没有用到0C中断
而且我是单机运行该程序,且单机测试该程序是否运行正常,所以地线不知道怎么接
空着。程序运行时靠ctrl+break结束。
用了1个dp=9脚的RS232插座,2-3脚直连,5脚空着 ,单机运行,待正常后在接到其他
单片机。
请您多指教,大虾,小弟先谢了。
────────────────────────────────────────
sogao (立交) 于 Thu Jan 9 19:26:38 2003) 说道:
我没做过你这样的实验,原来你是单机测试,但我知道你直接将2-3短接有点不妥,应该加
匹配电阻相连,我忘了5脚怎么处理,你查下书,你在连台电脑不更好。
────────────────────────────────────────
sogao (立交) 于 Thu Jan 9 19:40:04 2003) 说道:
对了,你可以把波特率改高些试试,2400通讯容易出问题,比如9600比较好
────────────────────────────────────────
boycool (灌水需要知识水平的,没水平别乱灌) 于 2003年01月10日11:17:41 星期五 说道:
我改了波特率,不行
────────────────────────────────────────
ambercctv (黑马) 于 2003年01月10日20:50:44 星期五 说道:
你中断处理函数的忘了清中断吧!
我觉得你最还还是用两台计算机的好一些,可以到教化
买一条电缆和两个9孔(9针)的接口回来自己接
计算机1 计算机2
2 3
3 2
5 5
────────────────────────────────────────
sayyou (sayyou) 于 2003年01月11日21:26:07 星期六 说道:
使用c自带的bioscom时,是需要硬件间的握手信号的,就是说
两串口间只使用三线连接是不够的,别的线也要连,一个串口
没试过。pc机不都有两个串口吗,他们之间通讯不就完了,两个
串口之间9根线的连接方法查查书吧
若想两个串口间使用三线连接,那就不要用c自带的函数了,自己写
一个吧,无非就是向指定的端口写字符和读字符,用inportb和
outportb。若用查询的方法就需要不断的查询线路状态寄存器,
建议还是使用中断的方法。
对了,初始化还是可以使用c自带的函数的,这样比较简单,
但是收数和发数程序就要自己写了
────────────────────────────────────────
deem (沙丘男爵) 于 2003年01月11日21:30:37 星期六 说道:
如果是单纯的串口之间通讯,可以考虑不要握手信号,但是如果要延长距离等
而要加上其他转接设备,比如说485转换等,还是把握手信号打开比较好,否则
回比较郁闷的。
────────────────────────────────────────
id (communication) 于 Sun Jan 12 18:02:48 2003) 说道:
在VB6.0下我用MSComm控件实现了单机串口通讯(2,3脚短接,5脚空着)
波特率为2400,正常
现在我实在不知道怎么办了
这个C语言程序究竟错在那呢??
还有,那位大虾能给个C语言串口通讯的例程啊(用TC写),我觉得用TC写速度快
实时性较好,也较简单
谢谢
我不是用中断方式接发收的
中断是用来补捉ctrl+break(用来结束程序)的
而且后面我也用函数恢复了中断啊
oldhandle=getvect(0x1b);
...
setvect(0x1b,oldhandle);
谢谢,期待您的指教
────────────────────────────────────────
ambercctv (黑马) 于 2003年01月12日18:49:51 星期天 说道:
void interrupt (*oldhandle)();
void interrupt ctrlbreak(void)
{
breakon=1;
//应该在这里加上这样一句实施
outp(0x20,0x20);
//清中断完成位
nt main(void) {
unsigned int key;
unsigned char ch;
int res=0;
oldhandle=getvect(0x1b);
breakon=0;
setvect(0x1b,ctrlbreak);
res=SerInit(PORT,B2400+DB8+SB1+NONE); /* 初始化串口,波特率2400 */
while(TRUE) {
if(breakon) break;
if(bioskey(1)) {
key=bioskey(0);
if(key & 0xff) {/* 发送普通字符 */
res=SerSend(PORT,key);
if( res & TIMEOUT) {
printf("Time out !\n");
break;}
}
}
res=SerStat(PORT);
if(res & RCVDRDY) {
key=SerRecv(PORT);
if(key &(BREAKDET | FRAMERR | PARERR | OVERERR)) {
if(key & BREAKDET) printf("Detect BREAK.\n");
if(key & FRAMERR) printf("Error:FRAME.\n");
if(key & PARERR) printf("Error:PARITY.\n");
if(key & OVERERR) printf("Error:OVERRUN.\n");
break; }
ch=key; /* 把key的低8位赋给char型ch */
Tty(ch);
}
} /* while */
setvect(0x1b,oldhandle);
getchar();
return 0;
} /* main */
unsigned SerInit(int port,unsigned char config) {
return (bioscom(0,config,port)); }
unsigned SerSend(int port,unsigned char ch){
return (bioscom(1,ch,port)); }
unsigned SerRecv(int port) {
return (bioscom(2,0,port)); }
unsigned SerStat(int port) {
return (bioscom(3,0,port)); }
void Tty(unsigned char ch) {
union REGS r;
r.h.ah=0x0e;
r.h.al=ch;
r.h.bh=0;
r.h.bl=0x07;
int86(0x10,&r,&r);
}
运行时老在res=SerSend(PORT,key)处出错,即程序返回值为Time out错误,
怎么回事???
windows me,tc 2.0,串口正常(已用其他程序测试过),通信时用9针插头,
把2-3直接短接,没有接地线。
────────────────────────────────────────
ambercctv (黑马) 于 2003年01月12日18:53:26 星期天 说道:
我记得在c语言中断函数的追后一句应该是
outp(0x20,0x20);
而你的中断函数ctrlbrek()里好像没有
其它的我就不太明白了
────────────────────────────────────────
ambercctv (黑马) 于 2003年01月12日18:54:41 星期天 说道:
说起来简单,坐起来难!!
────────────────────────────────────────
id (communication) 于 Mon Jan 13 19:47:21 2003) 说道:
在中国期刊网上有一篇文章《基于C语言的串口通讯程序设计》
就是下面的方法,3线制,向指定的端口写字符和读字符,用inportb和
outportb
能给我个完整的用bioscom的例程吗?大虾
────────────────────────────────────────
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.821毫秒