以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  DOS下C写串口的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=41490)


--  作者:aleng1314
--  发布时间:12/22/2006 11:02:00 AM

--  DOS下C写串口的问题
本人在DOS环境下用TC进行串口通信编程,2种方法都调通了   能收能发  (即用 inportb和outportb    还有一种用 bioscom)
      可现在有写些小问题   本人编写的是从机程序    要求接到命令  0xaa 后 立即 回复 0xaa 然后等待下步指令 本人在(inportb和outportb函数中)用循环读取串口的方式 读到AA后回复AA 因为是循环方式  他会在收到AA后不停的回复AA   这个怎么解决  希望能有达人给出这部分的源程序。
      后来我用bioscom 函数又重新编写了 一个函数  我用了这样的方式  即主机发送后 等待  而 从机回复后等待下个指令    源程序如下
#include "stdio.h"
#include "dos.h"
#include "bios.h"

#define PORT 0


int check_status(int);
void send_port(int,char);
char receive_port(int);
void wait (int);

void main()
{
  bioscom (0,0xe3,0);
  wait(0);
  while (check_status(0)!='1');
  {
   receive_port(0);
   if(receive_port(0)==0xaa);
  send_port(0,0xaa);
  }
  wait (0);
 

void send_port (int port,char cc)
{
 union
 {
  char ch[2];
  int status;
 }
 port_status;
 port_status.status=bioscom (1,cc,0);
}

char receive_port (int port)
     {
 union
 {
  char ch[2];
  int status;
 }port_status;
 port_status.status=bioscom (2,0,0);
 if (port_status.ch[1]&255)
 {
  exit (1);
 }
 else return port_status.ch[0];
     }

int check_status(int port)
  {
 int status;
 status=bioscom (3,0,0);
 if (status & 0x100)  return 0;
 else return 1;
  }
  
void wait (int port)
{
 if (check_status(0)!='1')
 {
  exit (1);
 }
}

为什么我走到等待这步( while (check_status(0)!='1');)后  就走不下去了    我基本的思想是查询串口的状态 有信号过来 对数据进行处理  无  则等待      
以上源程序 可单步走  编译好象不行  还没有怎么调试 有几个警告  
请达人帮忙指出   

我本人希望能用inportb 和outportb  写  这样数据好处理     这个程序应为太大不好传  有高手达人能帮忙的  可和我电邮联系  aleng13142263.net     小弟感激不尽


--  作者:aleng1314
--  发布时间:12/22/2006 11:17:00 AM

--  
错了  电邮是  aleng1314@263.net
--  作者:aleng1314
--  发布时间:12/25/2006 9:25:00 AM

--  
UP
--  作者:卷积内核
--  发布时间:12/25/2006 5:31:00 PM

--  
1、我在VC下用过线程监视端口,在接收数据后将缓冲区数据转存到临时缓冲区,然后清空接收缓冲区。
2、“( while (check_status(0)!='1');)后  就走不下去了”-----没有sleep来执行其他函数的余地,你进去后就成了死循环啦,所以就出不来了。wait (0);如果相当于sleep的话,应该放到while内部才会起作用啊。


--  作者:卷积内核
--  发布时间:12/25/2006 5:37:00 PM

--  
receive_port(0);
   if(receive_port(0)==0xaa);
  send_port(0,0xaa);

这一段中第一行是不是有点重复? “receive_port(0)==0xaa”中也读端口了啊,为什么要读两次呢?如果你在第一次读出后把缓冲区清空的话,第二次永远不会成立的。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
61.523ms