COM通讯例子(MS-DOS, TC3.0编译)
2007-09-20 19:11
393 查看
学习串口通讯时在网上找到的例子,虽然不是很顺利,但总算在这个程序的基础上实现了发送和接受。
下面的代码可能不是最好,但是根据注释,理解COM口的初始化和通讯步骤是没有问题了。
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define PORT1 0x3F8
#define INTVECT 0x0C
int bufferin = 0;
int bufferout = 0;
char ch;
char buffer[1025];
void interrupt(*oldportlisr)(__CPPARGS);
void interrupt PORTINT(__CPPARGS)
...{
int c;
do
...{
c = inportb(PORT1 + 5);
if (c & 1)
...{
buffer[bufferin] = inportb(PORT1);
bufferin++;
if(bufferin == 1024)
...{
bufferin = 0;
}
}
}while(c & 1);
outportb(0x20,0x20);
}
void main()
...{
int c;
FILE *fp;
/**//*clear Screen*/
clrscr();
/**//*turn off interrupt - Port1*/
outportb(PORT1 + 1,0);
/**//*save old interrupt Vector of later recovery*/
oldportlisr = getvect(INTVECT);
/**//*set interrupt vector entry*/
setvect(INTVECT,PORTINT);
/**//*PORT1 - Communication settings*/
/**//*SET DLAB ON*/
outportb(PORT1 + 3, 0x80);
/**//*Set Baud rate - divisor latch low byte*/
/**//*
0x01 = 115200 bps
0x02 = 57600 bps
0x06 = 19200 bps
0x0c = 9600 bps
0x18 = 4800 bps
0x30 = 2400 bps
*/
outport(PORT1 + 0, 0x01);
/**//*Set Baud rate - divesor latch high byte*/
outportb(PORT1 + 1, 0x00);
/**//*8 bits,no parity ,1 stop bit*/
outportb(PORT1 + 3, 0x03);
/**//*FIFO Control Register*/
outportb(PORT1 + 2,0xC7);
/**//*Turn on DTR,RTS,and OUT2*/
outportb(PORT1 + 4,0x0B);
/**//*Set programmable interrupt controller*/
outportb(0x21,(inportb(0x21) & 0xEF));
/**//*iNTERRUPT WHEN DATA RECEIVED*/
outportb(PORT1 + 1,0x01);
printf(" Sample Program.Press ESC to quit ");
fp = fopen("com.log", "wb");
do
...{
if(bufferin != bufferout)
...{
ch = buffer[bufferout];
bufferout++;
if(bufferout == 1024)
...{
bufferout = 0;
}
printf("%c",ch);
fwrite(&ch, 1,1, fp);
}
if(kbhit())
...{
c = getchar();
outportb(PORT1,c);
}
}while(c != 27);
fclose(fp);
/**//*Turn off interrupts - Port1*/
outportb(PORT1 + 1,0);
/**//*MASK IRQ using PIC*/
/**//*
COM1 (IRQ4) - 0X10
COM2 (IRQ3) - 0X08
COM3 (IRQ4) - 0X10
COM4 (IRQ3) - 0X08
*/
outportb(0x21,(inportb(0x21) | 0x10));
/**//*Restore old interrupt vector*/
setvect(INTVECT,oldportlisr);
}
下面的代码可能不是最好,但是根据注释,理解COM口的初始化和通讯步骤是没有问题了。
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define PORT1 0x3F8
#define INTVECT 0x0C
int bufferin = 0;
int bufferout = 0;
char ch;
char buffer[1025];
void interrupt(*oldportlisr)(__CPPARGS);
void interrupt PORTINT(__CPPARGS)
...{
int c;
do
...{
c = inportb(PORT1 + 5);
if (c & 1)
...{
buffer[bufferin] = inportb(PORT1);
bufferin++;
if(bufferin == 1024)
...{
bufferin = 0;
}
}
}while(c & 1);
outportb(0x20,0x20);
}
void main()
...{
int c;
FILE *fp;
/**//*clear Screen*/
clrscr();
/**//*turn off interrupt - Port1*/
outportb(PORT1 + 1,0);
/**//*save old interrupt Vector of later recovery*/
oldportlisr = getvect(INTVECT);
/**//*set interrupt vector entry*/
setvect(INTVECT,PORTINT);
/**//*PORT1 - Communication settings*/
/**//*SET DLAB ON*/
outportb(PORT1 + 3, 0x80);
/**//*Set Baud rate - divisor latch low byte*/
/**//*
0x01 = 115200 bps
0x02 = 57600 bps
0x06 = 19200 bps
0x0c = 9600 bps
0x18 = 4800 bps
0x30 = 2400 bps
*/
outport(PORT1 + 0, 0x01);
/**//*Set Baud rate - divesor latch high byte*/
outportb(PORT1 + 1, 0x00);
/**//*8 bits,no parity ,1 stop bit*/
outportb(PORT1 + 3, 0x03);
/**//*FIFO Control Register*/
outportb(PORT1 + 2,0xC7);
/**//*Turn on DTR,RTS,and OUT2*/
outportb(PORT1 + 4,0x0B);
/**//*Set programmable interrupt controller*/
outportb(0x21,(inportb(0x21) & 0xEF));
/**//*iNTERRUPT WHEN DATA RECEIVED*/
outportb(PORT1 + 1,0x01);
printf(" Sample Program.Press ESC to quit ");
fp = fopen("com.log", "wb");
do
...{
if(bufferin != bufferout)
...{
ch = buffer[bufferout];
bufferout++;
if(bufferout == 1024)
...{
bufferout = 0;
}
printf("%c",ch);
fwrite(&ch, 1,1, fp);
}
if(kbhit())
...{
c = getchar();
outportb(PORT1,c);
}
}while(c != 27);
fclose(fp);
/**//*Turn off interrupts - Port1*/
outportb(PORT1 + 1,0);
/**//*MASK IRQ using PIC*/
/**//*
COM1 (IRQ4) - 0X10
COM2 (IRQ3) - 0X08
COM3 (IRQ4) - 0X10
COM4 (IRQ3) - 0X08
*/
outportb(0x21,(inportb(0x21) | 0x10));
/**//*Restore old interrupt vector*/
setvect(INTVECT,oldportlisr);
}
相关文章推荐
- tc编译的dos程序和vc编译的win32控制台程序的区别
- 01 - 编译链接第一个wxWidgets3.0例子
- 文件夹生出.exe尾巴?原来是MS-DOS.com,fonts.exe,Default.exe,HelpHost.com等做怪2
- 手工编写servlet_MS-DOS编译servlet_Servlet修改后自动载入
- 总结了编译Com技术内幕的最后例子的编译问题.
- java使用ms-dos编译,运行程序
- 文件夹生出.exe尾巴?原来是MS-DOS.com,fonts.exe,Default.exe,HelpHost.com等做怪1
- 总结了编译Com技术内幕的最后例子的编译问题. 收藏
- 总结了编译Com技术内幕的最后例子的编译问题.
- 俄罗斯方块的源码,运行平台:DOS+TC3.0
- DOS中调用INT13中断操作磁盘 tc3.0
- tc编译的dos程序和vc编译的win32控制台程序的异同
- 怀旧一下:用VC(VS2008)编译DOS下TurboC(TC3)的C程序
- 终于明白了tc编译的dos程序和vc编译的win32控制台程序的区别
- Android Studio 3.0新建项目AAPT2 编译报错 Error:java.util.concurrent.ExecutionException: com.android.tools.aa
- MS-DOS下的命令解释程序COMMOND.COM
- C#中运行命令行截取输出流的例子(C#中截取dos内容)
- Common-pool源码编译——小例子
- Ubuntu编译调用FFmpeg so库Api方法例子
- QT4的FindDialog例子在VC6中编译时提示链接错误的一种直观的解决办法(包含过程思路)