历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2020年04月07日 | linux系统与51单片机实现串口数据交互

2020-04-07 来源:eefocus

// 以下是 用于 linux IO INPUT  AND OUT PUT

参考代码详细 参考一下网站  写得都很详细  其中函数代码和所遇问题测试摘自一下网站,感谢他们提供的函数资源

大家可以先去看看函数模型以及方法  个人觉得他们归纳的比较好

//http://www.cnblogs.com/meronzhang/archive/2012/11/24/2786165.html

//http://www.cnblogs.com/meronzhang/archive/2012/11/24/2786166.html

//http://www.doc88.com/p-9045754154843.html


以下是代码  其中,mian函数和51函数为自己写的测试代码 测试通过,不过仍有bug,就是数据没清空,导致数据一直在接收


#include

#include

#include

#include

#include

#include

#include

#include

#include #include

#define TRUE 1

#define FALSE -1


int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,


                    B38400, B19200, B9600, B4800, B2400, B1200, B300,


                  };


int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,


                  19200,  9600, 4800, 2400, 1200,  300,

                 };


struct termio


{

    unsigned short  c_iflag; /* 输入模式标志 */


    unsigned short  c_oflag;     /* 输出模式标志 */


    unsigned short  c_cflag;     /* 控制模式标志*/


    unsigned short  c_lflag;     /* local mode flags */


    unsigned char    c_line;           /* line discipline */


    unsigned char    c_cc[NCC];    /* control characters */


};


/**

*@brief  设置串口通信速率

*@param  fd     类型 int  打开串口的文件句柄

*@param  speed  类型 int  串口速度

*@return  void

*/


void set_speed(int fd, int speed)

{

    int   i;

    int   status;

    struct termios   Opt;

    tcgetattr(fd, &Opt);

    for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)

    {

        if  (speed == name_arr[i])

        {

            /**

             * tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。queue参数应是下列三个常数之一:

                * TCIFLUSH刷清输入队列。

             * TCOFLUSH刷清输出队列。

            * TCIOFLUSH刷清输入、输出队列。

             */

            tcflush(fd, TCIOFLUSH);//设置前flush

            cfsetispeed(&Opt, speed_arr[i]);

            cfsetospeed(&Opt, speed_arr[i]);

            //通过tcsetattr函数把新的属性设置到串口上。

            //tcsetattr(串口描述符,立即使用或者其他标示,指向termios的指针)

            status = tcsetattr(fd, TCSANOW, &Opt);

            if  (status != 0)

            {

                perror("tcsetattr fd1");

                return;

            }

            tcflush(fd,TCIOFLUSH);  //设置后flush

        }



    }



}


/****

*@brief   设置串口数据位,停止位和效验位

*@param  fd     类型  int  打开的串口文件句柄

*@param  databits 类型  int 数据位   取值 为 7 或者8

*@param  stopbits 类型  int 停止位   取值为 1 或者2

*@param  parity  类型  int  效验类型 取值为N,E,O,,S

*/


int set_Parity(int fd, int databits, int stopbits, int parity)


{

    struct termios options;

    if (tcgetattr(fd, &options) != 0)

    {

        perror("SetupSerial 1");

        return (FALSE);

    }

    options.c_cflag &= ~CSIZE;

    switch (databits)

        /*设置数据位数*/

    {

    case 7:

        options.c_cflag |= CS7;

        break;

    case 8:

        options.c_cflag |= CS8;

        break;

    default:

        fprintf(stderr,"Unsupported data sizen");

        return (FALSE);

    }

    switch (parity)

    {


    case 'n':

    case 'N':

        options.c_cflag &= ~PARENB; /* Clear parity enable */

        options.c_iflag &= ~INPCK; /* Enable parity checking */

        break;

    case 'o':

    case 'O':

        options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/

        options.c_iflag |= INPCK; /* Disnable parity checking */

        break;

    case 'e':

    case 'E':

        options.c_cflag |= PARENB; /* Enable parity */

        options.c_cflag &= ~PARODD; /* 转换为偶效验*/

        options.c_iflag |= INPCK; /* Disnable parity checking */

        break;

    case 'S':

    case 's': /*as no parity*/

        options.c_cflag &= ~PARENB;

        options.c_cflag &= ~CSTOPB;

        break;

    default:

        fprintf(stderr,"Unsupported parityn");

        return (FALSE);

    }

    /* 设置停止位*/

    switch (stopbits)

    {

    case 1:

        options.c_cflag &= ~CSTOPB;

        break;

    case 2:

        options.c_cflag |= CSTOPB;

        break;

    default:

        fprintf(stderr,"Unsupported stop bitsn");

        return (FALSE);

    }



    /* Set input parity option */



    if (parity != 'n')

        options.c_iflag |= INPCK;

    tcflush(fd, TCIFLUSH);

    options.c_cc[VTIME] = 50; /* 设置超时5 seconds*/

    options.c_cc[VMIN] = 0; /* Update the options and do it NOW */

    if (tcsetattr(fd, TCSANOW, &options) != 0)

    {

        perror("SetupSerial 3");

        return (FALSE);

    }

    return (TRUE);

}


void main()


{


    int fd;

    struct termios Opt;

    //struct  termios Opt;

    // ttyUSB0 是usb转串口数据线  有时为ttyUSB0 驱动是ch340  百度 有linux CH340驱动 或者虚拟机会自动安装驱动

    fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY); //|O_NOCTTY     //用文件描述符打开

    struct timeval timeout;    //构造串口机构体



    if(-1==fd)           //打开是否成功

    {

        perror("IO error");

    }


    int set_fd;



    set_fd=set_Parity(fd,8,1,'n');   //设置串口传输数据模式

    Opt.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/

    Opt.c_oflag  &= ~OPOST;   /*Output*/

    set_speed(fd,4800);


    //以下代码注释代码属于测试代码 并未实现 不需要可除去   已经有函数体实现 原始模式除外

    //tcgetattr(fd, &Opt);

    //cfsetispeed(&Opt,B4800);

    // cfsetospeed(&Opt,B4800);

    //tcsetattr(fd,TCSANOW,&Opt);

    // tcgetattr(fd,B4800);

    // cfsetospeed(&Opt,B4800);

    // tcsetattr(fd,TCSANOW,&Opt);

    char IO_read_buf[10]= {0};

    int read_fd=-1;

    int write_fd=-1;

    int fork_fd=-1;

    fork_fd=fork();


//while(1)


    {


        /*****采用进程创建的方法 一个读,一个写, 亦可以用多线程方法。

        ****/

        //读操作

        if(fork_fd>0)

        {

            while(1)

            {

                read_fd=read(fd,IO_read_buf,10-1);

                //printf("%d data=%sn",read_fd,IO_read_buf);

                if(read_fd>0)

                {

                    if(IO_read_buf[0]!=''&&IO_read_buf[0]!='n')   //去除空内容

                    {

                        IO_read_buf[read_fd+1]='';

                        printf("%d data=%sn",read_fd,IO_read_buf);

                    }

                    else

                    {

                        //printf("bad datan");

                    }

                }

                else

                {

                    perror("error");

推荐阅读

史海拾趣

AD Semiconductor公司的发展小趣事

AD Semiconductor是一家专注于模拟和数字混合信号集成电路的设计、生产和销售的公司。以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展: AD Semiconductor成立于1990年,总部位于美国马萨诸塞州。公司的创始人具有丰富的集成电路设计和制造经验,致力于开发高性能、高可靠性的模拟和数字混合信号芯片。初期,公司主要专注于功率管理、数据转换和信号处理等领域。

  2. 技术创新与产品推出: AD Semiconductor在技术创新方面取得了多项突破,不断推出具有领先性能的芯片产品。公司的产品涵盖了模拟转换器、运算放大器、数据采集系统、功率管理器等多个系列,广泛应用于通信、工业控制、汽车电子等领域。

  3. 市场拓展与国际化发展: 随着产品线的不断完善和市场认可度的提升,AD Semiconductor逐步拓展了国内外市场。公司在美国、中国、欧洲等地设立了销售和技术支持中心,与全球各地的客户建立了合作关系。通过与国际合作伙伴的合作,AD Semiconductor的产品远销至全球各地,赢得了广泛的市场认可。

  4. 并购与战略合作: 为了加强自身的技术实力和市场地位,AD Semiconductor进行了一系列的并购和战略合作。其中最重要的是2015年,AD Semiconductor收购了一家专注于RF和微波集成电路设计的公司,进一步拓展了在无线通信领域的业务布局。

  5. 持续创新与未来展望: AD Semiconductor致力于持续创新,不断推出符合市场需求的新产品和解决方案。公司将继续加强技术研发投入,提升产品性能和稳定性,以满足客户在不断变化的市场需求。未来,AD Semiconductor将继续致力于成为模拟和数字混合信号领域的领先企业,并为全球客户提供更加优质的产品和服务。

ADL [ADL Embedded Solutions Inc]公司的发展小趣事

ADL Embedded Solutions Inc. 是一家专注于嵌入式计算解决方案的公司,以下是该公司发展的五个相关故事:

  1. 公司创立与早期发展: ADL Embedded Solutions Inc. 成立于1994年,总部位于美国科罗拉多州科罗拉多斯普林斯市。公司初期致力于为工业、军事、航空航天等领域提供嵌入式计算解决方案。其产品包括工业级嵌入式计算板卡、系统、模块等。

  2. 技术创新与产品推出: ADL 在嵌入式计算领域不断进行技术创新,并推出了多款具有竞争力的产品。公司的产品具有高性能、低功耗、高可靠性等特点,得到了客户的广泛认可。其产品广泛应用于军事航空、医疗、交通、工业自动化等领域。

  3. 客户合作与项目案例: ADL 与各行业的领先企业建立了长期稳定的合作关系,并参与了众多重要项目。例如,公司为航空航天领域的客户提供了符合严格标准的嵌入式计算解决方案,为医疗设备制造商提供了可靠的嵌入式计算板卡等。

  4. 全球市场拓展与国际化发展: ADL 通过不断拓展国内外市场,实现了全球化发展。公司在美国、欧洲和亚洲等地设有销售办事处和服务中心,为客户提供本地化的技术支持和服务。同时,ADL 的产品远销全球各地,深受国际客户的青睐。

  5. 未来展望与持续发展: ADL 将继续致力于技术创新和产品开发,满足客户不断变化的需求。公司将不断扩大在工业、军事、医疗等领域的市场份额,加强与客户的合作,保持行业领先地位,实现业务的持续增长和发展。

登丰微(GSTEK)公司的发展小趣事

随着电子行业的快速发展和市场需求的不断变化,歌普电子也在积极调整战略布局,以应对未来的挑战和机遇。公司不仅在现有产品领域持续深耕细作,还积极探索新的业务领域和增长点。通过多元化布局和不断创新,歌普电子致力于成为电子行业的领军企业之一。未来,歌普将继续秉承“创新、高效、尊重、负责”的文化理念,为客户提供更加优质的产品和服务,共同推动电子行业的繁荣发展。

Foxconn_Optical_Interconnect_Technologies__Inc.公司的发展小趣事

歌普电子始终将产品质量视为企业的生命线。公司采用精细化管理模式,并严格执行ISO9001质量管理体系,确保每一件产品都达到高标准。同时,歌普的产品还通过了UL、CSA、TUV等国际安全认证及RoHS2.0、REACH欧盟绿色环保检测,进一步证明了其产品的可靠性和环保性。这些努力使得歌普在市场上获得了广泛的认可,与众多知名企业建立了长期稳定的合作关系。

DLP Design公司的发展小趣事

DLP绿色科技公司,积极响应国家环保政策,致力于研发和生产绿色环保的DLP技术产品。公司采用先进的生产工艺和材料,降低产品能耗和排放。同时,DLP绿色科技还积极推广节能环保的理念和技术,倡导消费者使用环保产品。通过不懈的努力和实践,DLP绿色科技在电子行业树立了绿色环保的典范形象,为行业的可持续发展做出了积极贡献。

请注意,以上故事均为虚构,旨在展示DLP Design公司在电子行业中的可能发展路径和成就。实际情况可能因公司背景、市场环境等因素而有所不同。

高创科技(gotrend)公司的发展小趣事

DLP联合科技公司,通过与国内外知名企业的技术合作,实现了技术的快速迭代和产品的升级换代。公司积极寻求与产业链上下游企业的合作机会,共同研发新技术、新产品。通过与合作伙伴的紧密合作,DLP联合科技在DLP技术领域取得了显著成果,为电子行业的发展做出了积极贡献。

问答坊 | AI 解惑

有關離電池電量顯示電路

各位好 想请问要是我已经有个充电器 电池为手机3.6V 1200mAh锂电池 想要做个可以显示电池剩余电量的功能 用四颗LED显示 按一下亮4颗表示充满电 依电量变少LED亮灯就递减(如附件) 已经知道可以用LM324 比较电路可以完成 但毕竟是10几年前在学校 ...…

查看全部问答>

LPC1343资料

这是我刚找的资料贡献给大家。 希望大家一起搜集资料多多共享…

查看全部问答>

培训市场直指就业

就业培训进一步深入人心   职业教育从其根本性质上说,就是为实现就业而进行的教育。随着就业成为当今社会关注的热点,就业培训理念在IT职业教育发展中也成为最受关注的话题。人们提及最多的就是职业教育首先应为就业服务,就业培训的理念已经在 ...…

查看全部问答>

关于Wince拼音输入法的怪问题(要求置顶!)

关于Wince拼音输入法的怪问题(要求置顶!) 这个拼音输入法问题,我在网上找了很久很久,发现好多网友都遇到了相同的问题,可是每个贴子问题都没解决就不了了之,只有一个提问的朋友解决了,解决完之后还没影了,也没有具体说明解决问题的办法。 ...…

查看全部问答>

求ads 1.2

求ads 1.2  for arm 的下载地址…

查看全部问答>

想买一种嵌入式开发板或成品,能完成下列的简单功能,内详。恳请各位达人给个建议。

我是软件工程师,对硬件不太熟,现在项目需要一种嵌入式的小型设备,需要完成的功能和要求如下: 1。TCP/IP网络通信,最好能支持浏览器 2。必须有VGA,或CVBS的电视接口。 3。最好能有音频输出 4。应用软件由我们自己开发,所以要有比较成熟的 ...…

查看全部问答>

关于AD转换的问题

最近忙于毕业设计,发现有个重要的问题没解决,用51进行AD转换,但是由于有三个不同数据故需要转换三次,就不知道怎么做了?用三路模拟就不知道怎么写程序了,书上是用汇编写的八路模拟,但是没看明白怎么用的,问下应该怎么写?…

查看全部问答>

普通电源变压器的讨论

本帖最后由 dontium 于 2015-1-23 13:19 编辑     对普通电源变压器的选用和检测不大熟悉,虽然网上也有很多资料,但看起来都很凌乱,而且基本上都是繁琐而且没有测试方法,想知道各位在实际应用中是怎么做得。    1.功 ...…

查看全部问答>

LM4F120实例分享--HID的USB键盘实例

最近入手了块LM4F120的板子,今天呆坐一下午调了个USB键盘的程序,发上来大家分享一下。 代码都很简单,基本都是官方代码的堆砌,我就不解释了。 使用,插入LM4F120开发板侧面usb口(再次吐槽,哪个线很难插呀很难插....),上电,自动识别usb设备 ...…

查看全部问答>

晒奖品了+评测

先来一张靓照吧: 看看什么主控和FLASH吧,安国的SC908呢,网上应该可以找到量产工具量产呢,前提是:不是硬伤。 闲着没事来个扩容检测:一切正常,可以安心使用。 另外最实在的测试就是把U盘塞满,看它会不会“ ...…

查看全部问答>