| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2236 人关注过本帖
标题:C语言的串口操作
只看楼主 加入收藏
_Dennis_h
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2015-3-6
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:3 
C语言的串口操作
一个月前电脑主板烧了。。。。。n久没来论坛了。
这次我又要来发问了。
今天在看一些用C操作的串口程序,大多数是C#和C++,用这个入门级别的C的没有。
而且代码大都年代久远,可能与编译器有关,可能与操作系统有关(我64bit win7)。所有的代码编译后数不清的error。
用C操作串口,会用到几个头文件吧<dos.h>、<conio.h>、<bios.h>。我用的是Pelles C(X64)没这几个头文件,网上下下来也不会用。
大神能不能给一个思路啊。怎么用C操作串口,用串口发送/接收16进制数据。
我这里有一个源代码,但是我用Pellse C编译,N个错误。
程序代码:
#include <stdio.h>
#include "dos.h"
#include "conio.h"
#define BUFFLEN 1024
void InitCOM();/* 初始化串口 */
void OpenPort();/* 打开串口 */
void ClosePort();/* 关闭串口,释放串口资源 */
void interrupt asyncint();/* 新的中断函数 */
void interrupt(*asyncoldvect)();/* 中断向量:用于保护中断现场 */
unsigned char Buffer[BUFFLEN];
int buffin = 0;
int buffout = 0;
void OpenPort()
{
    unsigned char ucTemp;
    InitCOM();
    asyncoldvect = getvect(0x0c);
    disable();
    inportb(0x3f8);
    inportb(0x3fe);
    inportb(0x3fb);
    inportb(0x3fa);
    outportb(0x3fc, 0x08|0x0b);
    outportb(0x3f9, 0x01);
    ucTemp = inportb(0x21)&0xef;
    outport(0x21, ucTemp);
    setvect(0x0c, asyncint);
    enable();
}
void interrupt asyncint()
{
    Buffer[buffin++] = inportb(0x3f8);
    if(buffin >= BUFFLEN) buffin = 0;
    outportb(0x20, 0x20);
}
void ClosePort(void)
{
    disable();
    outportb(0x3f9, 0x00);
    outportb(0x3fc, 0x00);
    outportb(0x21, inportb(0x21)&0x10);
    enable();
    setvect(0x0c, asyncoldvect);
}
void InitCOM()
{
    outportb(0x3fb, 0x80);
    outportb(0x3f8, 0x0c);/* 波特率设置为9600 */
    outportb(0x3f9, 0x00);
    outportb(0x3fb, 0x03);
    outportb(0x3fc, 0x08|0x0b);
    outportb(0x3f9, 0x01);
}
unsigned char read_char(void)
{
    unsigned unch;
    if(buffout != buffin)
    {
        unch = Buffer[buffout];
        buffout++;
        if(buffout >= BUFFLEN) buffout = 0;
        return(unch);
    }
    else
        return(0xff);
}
void send_char(unsigned char unch)
{
    while(((inp(0x3f8+5)) & 0x40) ==0);
    outportb(0x3f8, unch);
}
void main()
{
    unsigned char unChar;
    short bExit_Flag = 0;
    OpenPort();
    fprintf(stdout, "\n\nReady to Receive DATA\n"
            "Press [SEC] to quit...\n\n");
    do
    {
        if(kbhit())
        {
            unChar = getch();
            switch(unChar)
            {
                case 0x1b:
                    bExit_Flag = 1;
                    break;
            }
            if(!bExit_Flag)
                send_char(unChar);
        }
        unChar = read_char();
        if(unChar!= 0xff)
        {
            fprintf(stdout,"%c", unChar);
        }
    }while(!bExit_Flag);
    ClosePort();
}


搜索更多相关主题的帖子: 源代码 编译器 C语言 操作系统 
2015-06-08 20:43
_Dennis_h
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2015-3-6
收藏
得分:0 
版主肯定又会来说我。
2015-06-08 20:44
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:10 
Pelles C 这个不错哦我以前也用过
2015-06-08 20:50
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:10 
操作系统管理设备,楼主可以试试驱动编程


莫问前尘有愧,但求今生无悔
2015-06-09 10:20
快速回复:C语言的串口操作
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030914 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved