写的串口通讯的初始化函数,其中其中多处有问题,请赐教!!!!

zk635 2003-10-09 07:34:13
下面是c写的串口通讯的初始化函数,其中其中多处有问题,请赐教!!!!

#define COM1_INT_NUM 0x0c
#define COM1_BASE_ADDR 0x03f8
#define COM1_MASK_BIT 0x10
#define COM1_TX COM1_BASE_ADDR /* send data register */
#define COM1_RX COM1_BASE_ADDR /* receive data register */
#define COM1_BL COM1_BASE_ADDR /* baudrate_LSB low byte */
#define COM1_BH COM1_BASE_ADDR+1 /* baudrate_MSB high byte */
#define COM1_IM COM1_BASE_ADDR+1 /* interrupt mask register */
#define COM1_IS COM1_BASE_ADDR+2 /* intr_status register */
#define COM1_LC COM1_BASE_ADDR+3 /* line control register */
#define COM1_MC COM1_BASE_ADDR+4 /* modem control register */
#define COM1_LS COM1_BASE_ADDR+5 /* line status register */
#define COM1_MS COM1_BASE_ADDR+6 /* modem status register */


int init_com(int comport,unsigned long combaudrate,unsigned char commode)
{
void set_com_mode(int port,unsigned long baudrate,unsigned char mode);
void com1_exit();
void com2_exit();

unsigned int far *com_addr;
disable();
com_addr=(unsigned *)0x00400000; /*0x00400000什么作用???*/
if(comport==1)
{
if(*com_addr==COM1_BASE_ADDR) /*COM1_BASE_ADDR=0x0f38*/
{
com1_oldvect=getvect(COM1_INT_NUM);
setvect(COM1_INT_NUM,com1_intr);
outp(0x21,inp(0x21)&~COM1_MASK_BIT); /*COM1_MASK_BIT=0x08*/ /*上面这句是什么意思*/
set_com_mode(comport,combaudrate,commode);
enable();
if(atexit(com1_exit))
return(FALSE);
else return(TRUE);
}
else
{
enable();
return(FALSE);
}
}
else
{
if(*++com_addr==COM2_BASE_ADDR)
{
com2_oldvect=getvect(COM2_INT_NUM);
setvect(COM2_INT_NUM,com2_intr);
outp(0x21,inp(0x21)&~COM2_MASK_BIT);
set_com_mode(comport,combaudrate,commode);
enable();
if(atexit(com2_exit))
return(FALSE);
else return(TRUE);
}
else
{
enable();
return(FALSE);
}
}
}

void set_com_mode(int port,unsigned long baudrate,unsigned char mode)
{
unsigned char baud_high,baud_low;
baud_low=(short)(115200L/baudrate)&0x00ff; /*?????*/
baud_high=115200L/baudrate>>0x08; /*?????*/
if(port==1)
{
outp(COM1_LC,0x80); /*????*/
outp(COM1_BL,baud_low);
outp(COM1_BH,baud_high);
outp(COM1_LC,mode&0x7f); /*mode=3?*/
outp(COM1_IM,0x01);
outp(COM1_MC,0x08);
inp(COM1_LS); /* 这几句又是什么意思*/
inp(COM1_RX); /* reset interrupt */
inp(COM1_IS); /* reset interrupt */
inp(COM1_MS); /* reset interrupt */
}
else
{
outp(COM2_LC,0x80);
outp(COM2_BL,baud_low);
outp(COM2_BH,baud_high);
outp(COM2_LC,mode&0x7f);
outp(COM2_IM,0x01);
outp(COM2_MC,0x08);
inp(COM2_LS);
inp(COM2_RX);
inp(COM2_IS);
inp(COM2_MS);
}
}

...全文
1255 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs3008 2003-10-17
  • 打赏
  • 举报
回复
0x00400000在Windows下代表应用程序实例句柄,居然对它进行操作,还能运行,真不懂
HANDLE hHandle=GetModuleHandle(NULL);其中hHandle就等于0x00400000(一般情况下)
TopCoderONE 2003-10-17
  • 打赏
  • 举报
回复
2000下端口保护了,编译通过没有用的
zk635 2003-10-14
  • 打赏
  • 举报
回复
在2000下编译没有问题,我才是过了,我把下面这句话给屏了,就没有问题了
if(*com_addr==COM1_BASE_ADDR) //com_addr=(unsigned *)0x00400000;
zk635 2003-10-14
  • 打赏
  • 举报
回复
导致
可能 95, 98 可以运行, nt, 2000 都是不行的
的原因是什么
倾听
zk635 2003-10-14
  • 打赏
  • 举报
回复
代码是我从别人那拿到的
源代码我在2000下,用tc2.0编译可以通过,运行时,提示初始化串口失败,小弟不动,请多指教
谢!!!
comanche 2003-10-14
  • 打赏
  • 举报
回复
你给出的代码可能 95, 98 可以运行, nt, 2000 都是不行的, 我可以贴出那整个组件, 让你看看
zk635 2003-10-14
  • 打赏
  • 举报
回复
楼上请明示;
上面是用tc写的dos程序
comanche 2003-10-12
  • 打赏
  • 举报
回复
有点晕 inp 和 outp 都是过时函数了, 现在用的函数有
SetCommBreak,
SetCommConfig;
SetCommMask
SetCommState;
SetCommTimeouts;
和对应的 GetXXX
楼主是否在 windows 编程? 建议去找一个 delphi 版的 ASYNC32 组件, 只有 1000 行, 是目前我所知的最好串口组件了, 用纯 c++ 的一看就明白, 主要内容在那个线程上
fificake1 2003-10-10
  • 打赏
  • 举报
回复
有点晕。

69,369

社区成员

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

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