打印
[程序源码]

你把UML用在mcu或者linux开发上面了吗?

[复制链接]
楼主: keer_zu
手机看帖
扫描二维码
随时随地手机跟帖
101
keer_zu|  楼主 | 2014-5-19 10:02 | 只看该作者 回帖奖励 |倒序浏览
linux下对串口通信的封装:

头文件定义了串口‘类’
/******************************************************************************
                                                                           
File Name:      uart.h   --> serial.h                                             
Copyright:      DediProg                                                                               
Version:                                                               
Description:   
                        Uart Operation module definition
                                                                           
*******************************************************************************
Revision History
-------------------------------------------------------------------------
DATE                           NAME                   DESCRIPTION                              
20121214                Kevin.Zu                Create
20131205                Kevin.Zu                Add to ELS Controller project

*******************************************************************************/
#ifndef _UART_H_
#define _UART_H_


#ifdef   __cplusplus
    extern   "C"
    {
#endif

typedef  struct DpUart{
        int fd_p;
        /*** dev ***/
        char *uart_dev_path;
        int uart_flags;
        /*** set ***/
        int speed;
        int nDatabits;
        int nStopbits;
        int nParity;
        int c_cc_vtime;
        int c_cc_vmin;
        /*** operation ***/
        int (*UartOpen)(struct DpUart *uart);
        int (*UartClose)(struct DpUart *uart);
        int (*UartRecv)(int fd, char *buf, int len);
        int (*UartSend)(int fd, char *buf, int len);
}DpUart_t;


int uart_open(DpUart_t *p_uart);
int uart_close(DpUart_t *p_uart);
int uart_recv(int fd, char *buf, int len);
int uart_send(int fd, char *buf, int len);


#ifdef   __cplusplus
        }
#endif

#endif /* _UART_H_ */

使用特权

评论回复
102
keer_zu|  楼主 | 2014-5-19 10:04 | 只看该作者
c文件定义了‘类’的行为:
/******************************************************************************
File Name:      uart.c   --> serial.c                                                
Copyright:                                                             
Version:                                                               
Description:   
                        Uart Operation module

Author:                                EMAIL:
Kevin.Zu                          zukeqiang@gmail.com       
*******************************************************************************
Revision History
-------------------------------------------------------------------------
DATE                           NAME                   DESCRIPTION                              
20121214                Kevin.Zu                Create
20131205                Kevin.Zu                Add to ESL Controller project

*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <pthread.h>
#include <string.h>
#include <termios.h>
#include <assert.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include "sys.h"
#include "serial.h"


#ifdef   __cplusplus
    extern   "C"
    {
#endif

static int uart_set_attribution(DpUart_t *p_uart);

static int SpeedArr[15] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
                    B38400, B19200, B9600, B4800, B2400, B1200, B300};

static int NameArr[15] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300,
                   38400, 19200, 9600, 4800, 2400, 1200, 300};

int uart_open(DpUart_t *p_uart)
{
        p_uart->fd_p = open(p_uart->uart_dev_path,p_uart->uart_flags);
        if (p_uart->fd_p == -1) {
                perror("uart_open");
                return PL_OPEN_ERR;
        }
        return uart_set_attribution(p_uart);
}

int uart_close(DpUart_t *p_uart)
{
        int ret;
        if(p_uart->fd_p == -1){
                printf("err fd!\n");
                return PL_BADPARAMETER;
        }
        ret = close(p_uart->fd_p);
        if(ret != 0)
                return PL_CLOSE_ERR;
        p_uart->fd_p = -1;
        return PL_SUCCESS;
}

static int uart_set_attribution(DpUart_t *p_uart)
{       
        int i;
        int num;
        int status;
        struct termios Opt;

        tcgetattr(p_uart->fd_p, &Opt);

    /* set speed */
        num = sizeof(SpeedArr) / sizeof(int);
        for (i=0; i<num; i++){
                if (p_uart->speed == NameArr){
                        tcflush(p_uart->fd_p, TCIOFLUSH);
                        cfsetispeed(&Opt, SpeedArr);
                        cfsetospeed(&Opt, SpeedArr);
                        break;
                }
        }
       
        if (i > num){
                return PL_BADPARAMETER;
        }

        Opt.c_iflag &=~(IGNBRK|IGNCR|INLCR|ICRNL|IUCLC|IXANY|IXON|IXOFF|INPCK|ISTRIP);
        Opt.c_iflag |= (BRKINT|IGNPAR);
        Opt.c_oflag &=~OPOST;
        Opt.c_lflag &=~(XCASE|ECHONL|NOFLSH);
        Opt.c_lflag &=~(ICANON|ISIG|ECHO);
        Opt.c_cflag |= (CLOCAL|CREAD);

    /* set data bits */
        switch (p_uart->nDatabits){
                case 7:
                        Opt.c_cflag |= CS7;
                        break;
                case 8:
                        Opt.c_cflag |= CS8;
                        break;
                default:
                        perror("Unsupported data bits");
                        return PL_BADPARAMETER;
        }
   
    /* set parity */
        switch (p_uart->nParity){
                case 'n':
                case 'N':
                        Opt.c_cflag &= ~PARENB;
                        Opt.c_iflag &= ~INPCK;
                        break;
                case 'o':
                case 'O':
                        Opt.c_cflag |= (PARODD | PARENB);
                        Opt.c_iflag |= INPCK;
                        break;
                case 'e':
                case 'E':
                        Opt.c_cflag |= PARENB;
                        Opt.c_cflag &= ~PARODD;
                        Opt.c_iflag |= INPCK;
                        break;
                case 's':
                case 'S':
                        Opt.c_cflag &= ~PARENB;
                        Opt.c_cflag &= ~CSTOPB;
                        Opt.c_iflag |= INPCK;
                        break;
                default:
                        perror("Unsupported parity");
                        return PL_BADPARAMETER;
        }

        /* set stop bits */
        switch (p_uart->nStopbits){
                case 1:
                        Opt.c_cflag &= ~CSTOPB;
                        break;
                case 2:
                        Opt.c_cflag |= CSTOPB;
                        break;
                default:
                        perror("Unsupported stop bits");
                        return PL_BADPARAMETER;
        }

        tcflush(p_uart->fd_p, TCIFLUSH);
        //tcflush(fd, TCIOFLUSH);

        Opt.c_cc[VTIME] = p_uart->c_cc_vtime;
        Opt.c_cc[VMIN]  = p_uart->c_cc_vmin;

        if (tcsetattr(p_uart->fd_p, TCSANOW, &Opt) != 0){
                perror("tcsetattr err");
                return PL_BADPARAMETER;
        }

        ioctl(p_uart->fd_p, TIOCMGET, &status);
        status |= TIOCM_RTS;
        ioctl(p_uart->fd_p, TIOCMSET, &status);
        //fcntl(fd, F_SETFL, FNDELAY);


        return PL_SUCCESS;
}

int uart_recv(int fd, char *buf, int len)
{
        return read(fd, buf, len);
}


int uart_send(int fd, char *buf, int len)
{
    return write(fd, buf, len);
}

#ifdef   __cplusplus
        }
#endif

使用特权

评论回复
103
liufb| | 2014-5-19 11:06 | 只看该作者
keer_zu 发表于 2014-5-18 09:15
https://bbs.21ic.com/icview-732854-1-1.html
依照你的提议,我正在做了。

赞一个,LZ不仅技术值得我辈学习,精神亦值得我辈学习!

使用特权

评论回复
104
keer_zu|  楼主 | 2014-5-19 15:14 | 只看该作者
liufb 发表于 2014-5-19 11:06
赞一个,LZ不仅技术值得我辈学习,精神亦值得我辈学习!

感谢你的提议,相互交流。哈哈

使用特权

评论回复
105
qin854626383| | 2014-5-19 23:59 | 只看该作者
留名

使用特权

评论回复
106
jydjdongjie| | 2014-5-20 11:08 | 只看该作者
移植想学,请问楼主有没有这方面的好书??

使用特权

评论回复
107
keer_zu|  楼主 | 2014-5-20 11:18 | 只看该作者
jydjdongjie 发表于 2014-5-20 11:08
移植想学,请问楼主有没有这方面的好书??

不好意思,移植很少做。没办法给你推荐书。

使用特权

评论回复
108
jydjdongjie| | 2014-5-20 16:39 | 只看该作者
不好意思,是一直想学,打错字了

使用特权

评论回复
109
keer_zu|  楼主 | 2014-5-20 16:49 | 只看该作者
jydjdongjie 发表于 2014-5-20 16:39
不好意思,是一直想学,打错字了

想了解基础概念,看一下Booch的书,他是UML三剑客之一,如:《面向对象:分析与设计》。如果偏向嵌入式看一下Douglass的书,如:《嵌入式与实时系统开发》等。

使用特权

评论回复
110
fail| | 2014-5-21 14:36 | 只看该作者
必须在这里留个记号

使用特权

评论回复
111
//YZC| | 2014-5-21 17:35 | 只看该作者

使用特权

评论回复
112
lbc___| | 2014-5-21 23:03 | 只看该作者
很好

使用特权

评论回复
113
keer_zu|  楼主 | 2014-5-26 10:51 | 只看该作者
谈一下嵌入式环境使用面向对象分析的必要性。

首先,面向对象的分解方法和基于此上的“设计模式”在C#,JAVA等所实现的应用中:复用、可扩展性和封闭性(开闭原则)等所带来开发效率和测试效率等的大大提升是有目共睹的,因为这样的软件本身除了有足够的规模外,还有可扩展,容易维护等需求,它丰富的功能和新功能的随时扩展需求注定了这样做所带来的好处,也必须这样做。
        然而在嵌入式领域,一款硬件产品的生命周期是如此的长(特别在工业控制领域等),并且在其漫长的生命周期里机会很少有基于现有系统频繁的功能扩展(比如一台路由器一旦成为产品,谁又会天天要求在此基础上增加类似下载、存储之类的功能?这些上层的功能几乎注定会被划分给系统其它设备C#,JAVA等实现的那部分了),往往给我们的印象是:和上述PC端软件相比,它算是很简单。有必要将面向对象的分析处理方法和设计模式引进来吗?首先,虽然单个硬件产品的生命周期是足够长的,但是嵌入式工程师往往不会仅仅面对一个产品,他可能要处理一系列类似功能或者功能迥异的产品的开发,继承和复用带来的不仅仅是软件模块设计的效率,同时带来的是测试的效率。如果这样的复用不仅仅停留在类的复用上,而是把它扩展到模式的复用,那样复用的效果就可以大大提高,同时也大大增加了嵌入式软件复用的比例,进而提升开发效率。
        个人认为,基于C#和JAVA这样的应用,复用的主题是:某个特定软件实体在其生命周期的频繁扩展中。所以这种方式下,每次要做的工作是:原有软件整体 + 扩展部分。而嵌入式系统相对比较单一,复用的效果体现在:将基本功能和模式颗粒化,然后在每个新的嵌入式项目中做组合:模块(颗粒) + 模块 + 模块......  当然在一个产品的开发和升级中也会有:原有整体 + 扩展的必要。所以,我要表达的意思是:在嵌入式领域,如果想使用面向对象的分析和设计,将类似设计模式的应用添加进来,组合的技巧大于扩展,这个或许是嵌入式面向对象方法所要偏重的地方。
        综上所述,嵌入式领域使用面向对象的分析和设计是有必要性的:首先它是可行的,再者它是有效的,最后它确实有它自己的特点。

使用特权

评论回复
114
keer_zu|  楼主 | 2014-6-18 11:50 | 只看该作者
个人认为:           嵌入式开发的层面决定了它的设计方法学是复合的,不同部分采用不同的方法。

使用特权

评论回复
115
自然魂| | 2014-7-18 15:19 | 只看该作者
楼主是有思想的工程师。

使用特权

评论回复
116
msblast| | 2014-7-18 15:57 | 只看该作者
本帖最后由 msblast 于 2014-7-18 15:59 编辑

代码的堆砌与UML无关。

使用特权

评论回复
117
弥勒开怀笑| | 2014-7-18 16:13 | 只看该作者

使用特权

评论回复
118
dong_abc| | 2014-7-19 01:43 | 只看该作者
楼主,现在在21ic发代码是不会有人看的。

使用特权

评论回复
119
kerby81| | 2014-8-14 11:59 | 只看该作者
果断收藏

使用特权

评论回复
120
xlsbz| | 2014-10-12 19:22 | 只看该作者
keer_zu 发表于 2014-5-7 10:55
利用类图描述你的架构

用什么软件画的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则