CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

谁有www.gjwtech.com網站上的在dos下能用的用c编的串口通信程序,帮忙帖一下,给100分,言出必行,谢谢

楼主kwenne(城市清道夫)2005-01-28 17:00:04 在 C/C++ / C语言 提问

本人最近在做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

相关问题

  • C#串口通信
  • 谁有www.gjwtech.com網站上的在dos下能用的用c编的串口通信程序,帮忙帖一下,给100分,言出必行,谢谢
  • C# API 串口通信 代码
  • 求串口通信编程的书籍,C语言版
  • 在delphi和c#中如何实现串口通信
  • 谁有dos下面用turbo c编的串口通信程序
  • C#可以做串口通信的程序吗?适合吗?
  • 请问C++builder中有没有串口通信的控件?
  • 有人用C#做过串口通信吗?
  • 谁有《visual c++/turbo c 串口通信编程实践》原代码

关键词

  • win98
  • 串口通信
  • 循环
  • 数据
  • check
  • start
  • outportb
  • gjwtech
  • oldrec
  • rec

得分解答快速导航

  • 帖主:kwenne
  • YFY

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo