串口读不到数得问题

renzhe02 2008-07-30 09:20:59
下面得程序是将键盘上得一个字符发送到串口,然后读数,但是发现读不到任何数据,希望各位大侠帮忙!

#include <stdio.h>
#include <dos.h>

#define LSB 0
#define MSB 1

#define RXR 0
#define TXR 0
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6

#define Com1_base 0x3f8
#define uchar unsigned char


volatile uchar inputData;
volatile uchar onInput = 0x00;
volatile uchar onOutput = 0x00;

void interrupt (*OldVect)();
void interrupt SerialISR();

void InitCom()
{
uchar inttemp;
/*设置波特率什么的*/
outportb(Com1_base+LCR,0x80);
outportb(Com1_base+LSB,0x0c);
outportb(Com1_base+MSB,0x00);
outportb(Com1_base+LCR,0x03);
outportb(Com1_base+IER,0x01);

/*设置中断向量*/
OldVect = getvect(0x0c);
disable();
inttemp = inportb(0x21)&0xef;
outportb(0x21,inttemp);
setvect(0x0c,SerialISR);
enable();
}

void CloseCom()
{
disable();
outportb(Com1_base+IER,0x00);
outportb(Com1_base,0x00);
outportb(0x21,inportb(0x21)|~(0xef));
setvect(0x0c,OldVect);
}

void interrupt SerialISR()
{
/*串口中断服务代码*/
inputData = inportb(Com1_base+RXR);
onInput = 0x01;

/*服务代码结束*/
outportb(0x20,0x20); /*中断结束的代码*/
}

void SendChar(uchar key)
{
while( ((inportb(Com1_base + LSR)) & 0x40) == 0);
{
outportb(Com1_base + TXR,key);

}
}

void main()
{
uchar key;
uchar bExit_flag = 0x00;
InitCom();
while(!bExit_flag)
{
if(onInput == 0x01)
{
printf("c:%c",inputData);
printf("d:%d",inputData);
printf("s:%s \n",inputData);
onInput = 0x00;
}
if(kbhit())
{
switch(key = getch())
{
case 0x1b:
bExit_flag = 0x01;
break;
}
if(!bExit_flag)
SendChar(key);
}
}
CloseCom();
printf("Bye~.\n");
}


...全文
186 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
haohaokingXP 2008-08-03
  • 打赏
  • 举报
回复

是不是输入有问题啊~

void main()
{
uchar key;
uchar bExit_flag = 0x00;
InitCom();
char szSendString[20];
scanf("%s" ,szSendString);
while(!bExit_flag)
{
if(onInput == 0x01)
{
printf("c:%c",inputData);
printf("d:%d",inputData);
printf("s:%s \n",inputData);
onInput = 0x00;
}
if(kbhit())
{
switch(szSendString[i++])
{
case 0x1b:
bExit_flag = 0x01;
break;
}
if(!bExit_flag)
SendChar(key);
}
}
CloseCom();
printf("Bye~.\n");
}


采用这种方式 看看
0x1b??
11000000 2008-08-03
  • 打赏
  • 举报
回复

本来想调试看看的,可是我在vc6里编译就出错了。
在这条语句这里,不认识OldVect
void interrupt (*OldVect)();
renzhe02 2008-08-02
  • 打赏
  • 举报
回复
串口设置:com1(对应地址0x3f8) StopBits: 1, Parity: No, DataBits: 8
我用串口调试助手发送十六进制:20
可以收到一串十六进制数据 02 11 20 16 03
但是用这个程序发送后,只能收到最后一个数03

是我读串口数据的方法不对吗?还是我的显示串口数据的方法不对?
renzhe02 2008-08-02
  • 打赏
  • 举报
回复

/*读串口函数,现在就是这里读串口数据有问题,不清楚c里面读串口数据的原理*/
void interrupt SerialISR()
{
/*串口中断服务代码*/
inputData = inportb(Com1_base+RXR);
onInput = 0x01;

/*服务代码结束*/
outportb(0x20,0x20); /*中断结束的代码*/
}
/*发送指令到串口*/
void SendChar(uchar key)
{
while( ((inportb(Com1_base + LSR)) & 0x40) == 0);
{
outportb(Com1_base + TXR,key);

}
}


haohaokingXP 2008-08-02
  • 打赏
  • 举报
回复
恩,很有可能啊~

这是你串口发送数据的程序,串口助手已经显示,说明没有问题

而读串口程序可能有问题吧~

要不你一块发了,大家看看吧
haohaokingXP 2008-08-01
  • 打赏
  • 举报
回复

波特率设置的正确吗?
  • 打赏
  • 举报
回复
up
renzhe02 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iu_81 的回复:]
while(!bExit_flag)
执行了没有
[/Quote]
while(!bExit_flag) 是有执行得,当按 'ESC'键时软件退出

加conio.h还是读不到数
renzhe02 2008-07-31
  • 打赏
  • 举报
回复
up
K行天下 2008-07-30
  • 打赏
  • 举报
回复
是不是还要 conio.h
yuwei2589 2008-07-30
  • 打赏
  • 举报
回复
mark,学习,帮顶~
iu_81 2008-07-30
  • 打赏
  • 举报
回复
while(!bExit_flag)
执行了没有
renzhe02 2008-07-30
  • 打赏
  • 举报
回复
自己顶一个
提示一下:我用串口调试助手 是可以读到数据得

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧