使用C语言操作串口

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

我上网查了一下“windows C语言 串口”,希望能得到一些示例,但是没有成功,我得到的不是用CreateFile就是用这个模块那个模块,甚至扯上了用BIOS等恐龙时代的东东。无语,还是自己试一下的好。#include int main(void) { FILE *fp; if((fp=fopen("com3","r"))==NULL) puts("this way doesn't work!/n"); else puts("thiw way works!/n"); return 0; }

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

 

#include int main(void) { FILE *fp; char buf[100]; if((fp=fopen("com3","r"))==NULL) puts("Can't open com3 /n"); while(1) { if(fgets(buf,100,fp)!=0) puts(buf); } fclose(fp); return 0; }

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

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

那么程序应该更改成:

#include #include int main(void) { FILE *fp; char temp; char buf[100]; if((fp=fopen("com3","r"))==NULL) puts("Can't open com3 /n"); while(1) { temp=0; fscanf(fp,"%c",&temp); if(temp!=0) putchar(temp); else Sleep(100); } fclose(fp); return 0; }

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

 

你可能感兴趣的:(语言,c,fp,null,file,测试)