DOS系统下控制串口(1)

   一直想将串口编程整理一下,一来分享给想了解串口编程的爱好者,二来防止梳理一下对COM的认识,^_^。

以前在网上也查询了很多相关的串口编程,居多的是在Windos环境,使用VC,VB编写的,也有在DOS下编写,但是看了很久的代码,揣摩很久,有的地方还不明白。这次我分享的是DOS下的COM操作,下面是我编写验证OK的Code。


编译环境:MS-DOS 7.1 +Borland C3.1 

通过一个例子来说明吧,实现在DOS环境下,将DOS下的文件通过串口传送到其它终端设备(如:另一PC:Personal Computer)。

DOS(PC)  <---------(COM)-------> Windows(PC) 实现不同OS之间传送,Windows接收到数据可以依据规则做相应的处理,暂时不考虑数据的冗余校验(CRC)。

Code:

#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include <sys\stat.h>
#include <fcntl.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <dir.h>

unsigned char *cy_receive_buf; //文件字符
int lenchar=0;//文件字符的长度

/*=========================================================================*/
//1.初始化串口函数
/*initial COM */
/*Ex:InitCom(C1,0x0C,0x0B) --COM1,9600pbs,8bit Data,1 Stop Bit,odd Check*/


void InitCom(int Port,char BaudRate,char bits)
{
outportb(Port + 1, 0);         /* Turn off interrupts - Port*/
outportb(Port + 3, 0x80);      /* SET DLAB ON */
outportb(Port + 0, BaudRate);  /* Set Baud rate-Low 8 Byte */
outportb(Port + 1, 0x00);      /* Set Baud rate -High 8 Byte */
outportb(Port + 3, bits);      /* 8 Bits, No Parity, 1 Stop Bit */
}

/*=========================================================================*/
//2.发送数据函数
// Send Data Function,Data 为字节
int Send(int Port,char Data)
{
  unsigned char status = inportb(Port + 5);  /* Check Line Status */
  unsigned int count = 2000;
  while(!(status & 0x20) && (count > 0))
  {
    count --;
    status = inportb(Port + 5);
  }


  if(count > 0)
  {
    outportb(Port + 0, Data);
    return 0;
  }
  else
  {
    printf("COM Send Data Error!\n");
    return -1;
  }
}
/*=========================================================================*/

//3.接收数据
//Receive Data Function
int Receive(int Port)
{
  char *pd;
  unsigned char  status = inportb(Port + 5); /* Check Line Status */
  if(status & 0x01)
{
*pd = inportb(Port + 0); /* Read */


//printf(" %x \n",*pData);
return *pd;
}
return 0;
}
/*=========================================================================*/

//4.Help
void Help(void)
{
printf("Syntax error :\n");
printf("Usage : send |<COM Port>|<filename>\n");
printf("<COM Port> : C1 ==> COM1 0x3F8\n");
printf("<COM Port> : C2 ==> COM2 0x2F8\n");
printf("<COM Port> : C3 ==> COM3 0x3E8\n");
printf("<COM Port> : C4 ==> COM4 0x2E8\n");
printf("<COM Port> : C5 ==> COM5 0x2E0\n");
printf("<COM Port> : C6 ==> COM6 0x2F0\n");
printf("<filename> : C123NB6.008 ==>Log File Name\n");
printf("Example : send C1 \\C123NB6.008==> Use COM1 Up log File C123NB6.008\n" );
exit(-1);
}
/*=========================================================================*/

/*=========================================================================*/
//5.Main Function

int main(int argc,char **argv)
{
int i,Port;
FILE *fp;  //For Open Log File ,文件指针
char ch;         // Read Log File
int  wFileLen; //读取文件长度
char *CName; //Use Which Com Port
char *FName ; //For LogFile Name


//char Path[50]="C:\\Borlandc\\bin\\";   //For Log File Path

char *PathFile;     //For Link Path +FileName

       char buffer[MAXPATH];
getcwd(buffer, MAXPATH); //获取当前路径

if (argc <2 )
{
Help();
return -1;
}

if (strcmp( argv[1],"/?")==0)
{
Help();
return -1;
}


if (strcmp( argv[1],"?")==0)
{
Help();
return -1;
}

if((strcmp(argv[1],"C1") != 0) && (strcmp(argv[1],"C2") != 0) && (strcmp(argv[1],"C3") != 0) && (strcmp(argv[1],"C4") != 0))
{
Help();
return -1;
}


if (argc >3)
{
Help();
return -1;
}


//第一个参数是COM PortID,第二个参数是要传送的文件名
if (argc >= 2)
{
//COM PortID
//printf("Which COM Port Used:%s\n",argv[1]);


CName=argv[1];
if (strcmp(CName,"C1")==0)
Port=0x3F8;
if(strcmp(CName,"C2")==0)
Port=0x2F8;
if(strcmp(CName,"C3")==0)
Port=0x3E8;
if(strcmp(CName,"C4")==0)
Port=0x2E8;
if(strcmp(CName,"C5")==0)
Port=0x2E0;
if(strcmp(CName,"C6")==0)
Port=0x2F8;


//要传送的文件名称
//printf(" LogFile Name is:%s\n",argv[2]);
FName=argv[2];
}

//For Debug调试使用
// printf("Port is %d \n",Port);
//printf("Path is :%s\n",buffer);

//路径加文件名称 
PathFile=strcat(buffer,FName);  
 
//For Debug调试使用
  //printf("Path and File Name is :%s\n",PathFile);
    // getch();


//读取要传送的文件
if((fp=fopen(PathFile,"rb"))==NULL) //Read Only
{
printf("Open Log File Error!\n");
exit(-1);
}

//文件读取成功,获取文件内容长度
//printf("File length :%ld\n",filelength(fileno(fp)));


wFileLen=filelength(fileno(fp));

//对内容做CRC16校验的话,要在发送的内容上加入2位校验位
//重新定义数组的大小为文件大小加2(校验位的高低位)

//不考虑校验值的情况,取消下一步
//cy_receive_buf = (unsigned char*)calloc(wFileLen+2,sizeof(char));

cy_receive_buf =(unsigned char*)calloc(wFileLen+0,sizeof(char));

ch=fgetc(fp);

//printf("COM Initialize...           \n");

    InitCom(Port,0x0C, 0x03);//9600bps,8位数据位,0x03无校验,1为停止位
     delay(50);
while(ch!=EOF)
{
//putchar(ch);//输出显示,方便调试
//crc_chec_fuc(ch) ;
//Send(Port,ch);
cy_receive_buf[lenchar]=ch;
lenchar++;
  //delay(5);
ch=fgetc(fp);
}
printf("\n");


//计算读取字符串的CRC值
//暂时不做CRC
//Calculate_CRC(cy_receive_buf,wFileLen);
//getch();

//printf("\n");

//获取要发送字符串的CRC高位和低位
//cy_receive_buf[wFileLen+0]=get_Hvalue(CRC) ;
//cy_receive_buf[wFileLen+1]=get_Lvalue(CRC);

//显示获取的高低位的值   
  //printf("CRCH is %x\n",cy_receive_buf[wFileLen+0]);
//printf("CRCL is %x\n",cy_receive_buf[wFileLen+1]);
// getch();

//开始上传读取的文件的内容
//printf(" Log File Uploading ....\n");


//移除校验的高低字节(2位)
//for(i=0;i <wFileLen+2;i++)
for(i=0;i <wFileLen;i++)
{
 //For Debug 显示发送的字符
// printf("%02X ",cy_receive_buf[i]);
delay(1);
//getch();
Send(Port,cy_receive_buf[i]);
}
//发送完成后发送一个特殊字符,告知接收到该字符
//为发送完成标志,这个字符由上位机处理(Windos PC )
Send(Port,'§');
fclose(fp);
return 0;
}



此代码编译验证PASS,可以发送文件内容,可以使用串口调试工具测试。

接收的数据可以在上位机上处理成自己需要的字符串。如果有任何疑问,可以联系我讨论。







  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: DOS系统下的Red Board是什么?Red Board是一种基于DOS操作系统的开发板。它具有易于使用和简单的设计,旨在帮助开发者快速构建和测试基于DOS的应用程序。Red Board的硬件配置包括处理器、内存和存储器等基本组件,以及用于扩展功能的接口和插槽。 在DOS系统下,Red Board提供了一种方便且高效的方式来开发DOS应用程序。它具有友好的用户界面和命令行界面,使开发者可以轻松地编写、调试和执行程序。红板还配备了一些常用的工具和库,以加速开发过程。 Red Board可用于各种应用场景,包括嵌入式系统开发、学术研究和实验等。它可以与外部设备和传感器进行连接,从而实现更复杂的功能。在DOS系统下,Red Board可以实现数据采集、控制设备、通讯等任务。 红板的优点在于它的稳定性和兼容性。作为基于DOS系统的开发板,它具有较低的硬件需求,可以在各种旧版和新版的计算机上运行。此外,使用Red Board开发的应用程序与其他DOS系统兼容,因此可以在更多的计算机上运行。 总之,DOS系统下的Red Board是一款用于开发和测试基于DOS的应用程序的开发板。它提供了一种简单而高效的方式来编写和执行程序,并具有广泛的应用领域和兼容性。 ### 回答2: DOS系统是一种基于磁盘操作系统的计算机操作系统,它是早期个人计算机系统中最为常见的操作系统之一。而红板是指红色基板电路板,它通常用于Arduino开发板。下面是关于DOS系统下红板的一些信息。 在DOS系统下使用红板,通常需要连接红板到计算机的串行端口上,使用串口通信进行数据传输。通过串口DOS系统可以向红板发送控制指令和数据,以实现与外部设备的交互。 使用红板开发硬件项目时,DOS系统可以作为编程环境。用户可以在DOS系统中使用汇编语言或C语言等编程语言编写代码,通过红板控制外部设备的输入输出。例如,可以编写程序控制红板连接的传感器采集数据,并将数据传输到计算机上进行处理和分析。 此外,DOS系统下常用的集成开发环境(IDE)如Turbo Pascal和Borland C++等也可以用于开发红板项目。这些IDE提供了丰富的功能和工具,使得在DOS系统下开发红板项目更加便捷。 总的来说,使用DOS系统下的红板可以实现与外部设备的交互,进行硬件开发和编程。它为用户提供了一种简单而灵活的开发环境,可以进行各种实验和项目的探索,对于学习和理解计算机硬件和软件之间的关系也具有一定的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysh05

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值