谁有www.gjwtech.com網站上的在dos下能用的用c编的串口通信程序,帮忙帖一下,给100分,言出必行,谢谢
本人最近在做dos下用c编的串口通信程序,自己也做了一个,在win98下能收和发,但是一进入纯dos,突然间数据的收发都用不了了,好像发不出去也收不到数据,这是什么原因呢?
同时,谁有www.gjwtech.com網站上的在dos下能用的用c编的串口通信程序,帮忙帖一下,给100分,言出必行,谢谢了!!
问题点数:100、回复次数:10Top
1 楼kwenne(城市清道夫)回复于 2005-01-28 17:03:27 得分 0
gjwtech。com这个网站已经不提供程序的下载了,所以才来这里的,麻烦了!程序要全且能用,:0Top
2 楼YFY(天易)回复于 2005-01-29 08:31:40 得分 100
网站的没有,我们在用的倒有,自己写的,中断~Top
3 楼kwenne(城市清道夫)回复于 2005-01-29 15:04:27 得分 0
YFY,能提供一下吗?如果好用,也行呀!:)不过我碰到一个问题,不知道你们有没有遇到过,就是在win98下能用的串口程序,到了纯dos下就用不了了,这是为什么,有人知道吗?Top
4 楼YFY(天易)回复于 2005-01-29 15:45:43 得分 0
brand c++3.1 编译的,在纯dos下关键设备正使用的,与windows通讯,
上千台设备正在使用的dos通讯的部分:
void interrupt ( *oldrec_handler)(__CHJCPPARGS);
void interrupt rec_handler(__CHJCPPARGS);
void init_start(int);
void init_end();
void send_data(unsigned char c);
void send_buff(unsigned char *);
void init_start(int com)
{
disable();
oldrec_handler = getvect(0x0c);
setvect(0x0c, rec_handler);
rs_port=inportb(0x21);
outportb(0x21, 0xef & rs_port);
if (com==1)
com = 0x3f0;
else
com=0x2f0;
outportb(com+0x0b, 0x80 );
outportb(com+0x08, 0x0c ); //boud rate=38400,9600,1200,if 03,0c,60
outportb(com+0x09, 0 );
outportb(com+0x0b, 0x03);
outportb(com+0x0c, 0x0b );
outportb(com+0x09, 0x01 );
enable();
outportb(com+0x0c,inportb(com+0x0c)|0x02);
send_buff(send_text);
}
void init_end()
{
disable();
outportb(0x21,rs_port);
setvect(0x0c, oldrec_handler);
enable();
}
void interrupt rec_handler(__CHJCPPARGS)
{
unsigned char c;
disable();
while(inportb( 0x3fd ) & 0x01 ==0)
{
}
c = inportb( 0x3f8 );
if (rec_endflag==1)
{
if ( c==rec_check )
{
buff_ready=1;
rec_endflag=0;
retire=0;
rec_buff[rec_length]=NULL;
}
else if (retire<=3)
{
rec_endflag=0;
rec_length=0;
buff_ready=0;
send_data(NAK);
retire++;
}
}
else
{
if (c >= 0x20)
{
rec_buff[rec_length]=c;
rec_check=rec_check ^ c;
rec_length++;
if (rec_length >= 200)
rec_length=0;
}
else
{
if(c==NAK)
{
if(retire<=3)
{
//send_buff(send_text);
retire++;
}
}
else if (c==SOH)
{
rec_length=0;
rec_check=0;
retire=0;
buff_ready=0;
}
else if (c==EOT)
rec_endflag=1;
}
}
outportb( 0x20, 0x20);
enable();
}
//***********************************************************
// send one date
//***********************************************************
void send_data(unsigned char c)
{
//disable();
while((inportb(0x3fd)&0x20) ==0 )
{
}
outportb(0x3f8,c);
//enable();
}
void send_buff(unsigned char *text)
{
unsigned char send_check,send_length;
send_data(SOH);
send_data(SOH);
send_check=0;
send_length=0;
// printf("send text=");
// puts(text);
// printf("\n");
while(*text != NULL)
{
send_data(*text);
send_check=send_check ^ (*text);
text++;
send_length++;
if (send_length>=128)
break;
}
send_data(EOT);
send_data(send_check);
//send_data(0);
}
Top
5 楼oo(为了名副其实,努力学习oo技术ing)回复于 2005-01-29 16:01:35 得分 0
markTop
6 楼kwenne(城市清道夫)回复于 2005-02-21 21:04:02 得分 0
YFY,这是我修改的程序
#include <stdio.h>
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define BUFSZ 1024
unsigned char m_InBuffer[BUFSZ]; /*循环队列,保存接收到的数据*/
unsigned char m_uchTXBuffer[BUFSZ]; /*发送缓冲区*/
unsigned char m_uchRXBuffer[BUFSZ]; /*接收缓冲区*/
unsigned int m_nInHead; /*循环队列中队首*/
unsigned int m_nInTail;
unsigned char rs_port;
long int numsum=0; /*循环队列中队尾*/
void interrupt ( *oldrec_handler)();
void interrupt rec_handler();
void init_start(int);
void init_end();
void init_start(int com)
{
disable();
oldrec_handler = getvect(0x0c);
setvect(0x0c, rec_handler);
rs_port=inportb(0x21);
outportb(0x21, 0xef & rs_port);
if (com==1)
com = 0x3f0;
else
com=0x2f0;
outportb(com+0x0b, 0x80 );
outportb(com+0x08, 0x0c ); /*/boud rate=38400,9600,1200,if 03,0c,60*/
outportb(com+0x09, 0 );
outportb(com+0x0b, 0x03);
outportb(com+0x0c, 0x0b );
outportb(com+0x09, 0x01 );
enable();
outportb(com+0x0c,inportb(com+0x0c)|0x02);
}
void init_end()
{
disable();
outportb(0x21,rs_port);
setvect(0x0c, oldrec_handler);
enable();
}
void interrupt rec_handler()
{
disable();
while(inportb( 0x3fd ) & 0x01 ==0)
{
}
if (((m_nInTail + 1) % BUFSZ) !=m_nInHead)
{
m_InBuffer[m_nInTail] = inportb( 0x3f8 );
m_nInTail = (m_nInTail + 1) % BUFSZ;
}
outportb( 0x20, 0x20);
enable();
}
int ComPortRX()
{
unsigned char chData;
if (m_nInTail != m_nInHead) /*如果当前串口有数据过来*/
{
chData = m_InBuffer[m_nInHead];
m_nInHead = (m_nInHead+1)%BUFSZ;
printf("%d ",chData);
numsum++;
}
}
main()
{ unsigned char chData,key;
init_start(1);
do{
key=kbhit();
if(key!=0)
key='q';
ComPortRX();
}
while (key!='q');
printf("\nnumber==%d ",numsum);
getch();
init_end();
getch();
}Top
7 楼YFY(天易)回复于 2005-02-21 21:25:46 得分 0
明天再看,今天感冒,睡觉先.Top
8 楼Mdeathys(junhuo)回复于 2005-02-22 14:31:30 得分 0
顶~~~~~~Top
9 楼YFY(天易)回复于 2005-02-22 18:20:41 得分 0
我看了一下你的程序,init_start(int com)函数中,
if (com==1)
com = 0x3f0;
else
com=0x2f0;
是与硬件相关的,你用的普通计算机不一定是那个地址,
我们是专门为我们自己的设备编写的非通用程序,我们的硬件中串口对应的端口就是那个值.
你可以在windows下的设备管理器中找到该串口的实际物理地址,设置一下该值.
另外你用的变量m_nInHead,m_nInTail最好显示的初始化一下.
注意设置另一段的串口通讯设置为:
波特率:9600
数据位:8
奇偶校验:无
停止位: 1
Top
10 楼kwenne(城市清道夫)回复于 2005-02-27 19:36:06 得分 0
谢谢YFYTop




