C控制串口

来源:互联网 发布:数据交换平台技术规范 编辑:程序博客网 时间:2024/05/16 13:57

其实这并不是一件很难的事,在自己动手实验之前,我自然是知道现代操作系统都将设备看成文件来处理,这无疑降低了程序员操作硬件的难度,使用标准IO就可以操作硬件。

我上网查了一下“windows C语言 串口”,希望能得到一些示例,但是没有成功,我得到的不是用CreateFile就是用这个模块那个模块,甚至扯上了用BIOS等恐龙时代的东东。无语,还是自己试一下的好。

[c-sharp] view plaincopy
  1. #include <stdio.h>  
  2. int main(void)  
  3. {  
  4.     FILE *fp;  
  5.     if((fp=fopen("com3","r"))==NULL)  
  6.         puts("this way doesn't work!/n");  
  7.     else  
  8.         puts("thiw way works!/n");  
  9.     return 0;  
  10. }  

编译。。。运行。。。!!不好使啊,this way doesn't work!!!。wait 有个关键因素忘记了,我的U口转串口是com3,但是我还没有插入U口转串口啊!插上,哈哈,this way works!。但这还不能说明问题啊,我又用我的丁丁串口调试助手进行了一下测试,哈哈“该串口正在使用”。这回确信无疑了,方法是好使的,没想到竟然这么简单,那些人啊,把简单的事情弄复杂了!!!进一步操作。我要接受串口数据。

 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int main(void)  
  3. {  
  4.     FILE *fp;  
  5.     char buf[100];  
  6.     if((fp=fopen("com3","r"))==NULL) puts("Can't open com3 /n");  
  7.     while(1)  
  8.     {  
  9.         if(fgets(buf,100,fp)!=0)  
  10.         puts(buf);  
  11.     }  
  12.     fclose(fp);  
  13.     return 0;  
  14. }  

啊哈,刚开始的我是没有加if(fgets(buf,100,fp)!=0) 这个判断的,结果打印一连串的空行,刚开始还很奇怪,后来明白了,自己的编程能力有下降了!但是还是有些问题,有时候有错的字符,而且绝大多数时候的输出在不同的地方或多或少的加了回车,这应该是经过一次fgets()没有一次将数据读入,导致的结果。而之所以会出现乱码,是因为程序中有中文字符,中文字符占两个字节,而在中文字符一个字节之后断开,导致后续的字符解释失误,这在其他程序中也是有的现象!我在一个小的测试中初步证实了猜测,做法就是在puts后再puts("----")结果发现一次输出中加载了几次"---"。

我又打印了我获得数据的10进制值,发现大量的未显示字符其实是0x01也就是SOH,Start of heading。那么这就好解决了。(弄错了啊,是-1,不明白是怎么回事,好像getc将不能显示的字符返回-1?)

那么程序应该更改成:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <windows.h>  
  3. int main(void)  
  4. {  
  5.     FILE *fp;  
  6.     char temp;  
  7.     char buf[100];  
  8.     if((fp=fopen("com3","r"))==NULL) puts("Can't open com3 /n");  
  9.     while(1)  
  10.     {  
  11.         temp=0;  
  12.         fscanf(fp,"%c",&temp);  
  13.         if(temp!=0)  
  14.             putchar(temp);  
  15.         else  
  16.             Sleep(100);  
  17.     }  
  18.     fclose(fp);  
  19.     return 0;  
  20. }  

哈哈,这回可以了,加上那个Sleep()的目的是防止CPU的使用率过高。嘿嘿,到此结束!!!满意的原创!!!