色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux下串口的應用開發

CHANBAEK ? 來源:小陳學不停 ? 作者:小陳學不停 ? 2023-01-12 16:42 ? 次閱讀

1 背景
BB-BLACK是16年買的一塊開發板,時隔5年,板子上面卻看不到一絲歲月的痕跡,這兩天研究一下linux下串口的應用開發。

2 所使用的鏡像文件以及rootfs

名稱 描述
U-引導 bb-black-debian-u-boot.tar.bz2
內核 bb-black-debian-kernel-3.8.tar.bz2
根FS prebuild-BBB-Exp-V2-eMMC-flasher-20140626.tar.gz/build/systems/Debian/rootfs.tar.gz

3 硬件連接
選擇串口4

圖片

4 cape的使用
BB-BLACK的一些引腳功能,外設接口設備都可以通過cape來管理,我們要使用串口4設備,那就需要向這個cape中插入串口4設備
4.1 添加環境變量

export SLOTS=/sys/devices/bone_capemgr.9/slots

4.2 查看當前設備

cat $SLOTS 
 0: 54:PF--- 
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI

4.3 向cape中添加串口4設備

echo BB-UART4 > $SLOTS

4.4 檢查是否添加成功

ls ttyO*
ttyO0  ttyO4

4.5 設置波特率

stty -F /dev/ttyO4 115200

4.6 簡單測試收發

echo "test" > /dev/ttyO4
cat /dev/ttyO4

5 安裝輔助工具
基本的收發測試正常后就可以進行應用開發了,我們需要安裝一些工具來提高效率
5.1 掛載nfs文件系統
5.1.1 ubuntu下安裝nfs

sudo apt-get install nfs-kernel-server
sudo apt-get install nfs-common

5.1.2 設置路徑

/home/samba *(rw,sync,no_root_squash)

5.1.3 測試掛載

mount -t nfs 192.168.0.193:/home/samba /mnt -o nolock

如果報錯提示報錯可能是路徑不對、目錄權限問題

mount.nfs: access denied by server while mounting
192.168.0.193:/home/samba

5.2 安裝samba實現windows和ubuntu之間的文件共享
5.2.1 安裝samba

sudo apt install samba samba-common -y

5.2.2 配置samba

sudo mkdir /home/samba
sudo vim /etc/samba/smb.conf
[samba]
    comment=samba
    path = /home/samba
    public = yes
    writable = yes
    create mask = 0777
    directory mask = 0777

5.2.3 開機啟動samba

systemctl enable smbd

5.2.4 啟動samba

samba systemctl start smbd

5.3 安裝出錯時可能需要重新配置一下dpkg

sudo dpkg --configure -a
sudo apt update

6 應用測試
6.1 相關代碼
6.1.1 串口的配置、打開、關閉、讀寫接口

int uart_open(int fd,char*port)
{    
    fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);    
    if (fd<0)    
    {    
        perror("Can't Open Serial Port");    
        return(RES_UART_FALSE);    
    }    
    //恢復串口為阻塞狀態                                   
    if(fcntl(fd, F_SETFL, 0) < 0)    
    {    
        printf("fcntl failed!\\n");    
        return(RES_UART_FALSE);    
    }         
    else    
    {    
        printf("fcntl=%d\\n",fcntl(fd, F_SETFL,0));    
    }    
    return fd;    
}    



void uart_close(int fd)    
{    
    close(fd);    
}    


int uart_config(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)    
{    

    int   i;    
    int   status;    
    int   speed_arr[] = { B115200, B19200, B9600, B4800, B2400, B1200, B300};    
    int   name_arr[] = {115200,  19200,  9600,  4800,  2400,  1200,  300};    

    struct termios options;    

    int res = tcgetattr( fd,&options);
    if( res  !=  0)    
    {    
        perror("SetupSerial 1");  
        return(RES_UART_FALSE);     
    }    

    //設置串口輸入波特率和輸出波特率    
    for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)    
    {    
        if  (speed == name_arr[i])    
        {                 
            cfsetispeed(&options, speed_arr[i]);     
            cfsetospeed(&options, speed_arr[i]);      
        }    
    }         

    //修改控制模式,保證程序不會占用串口    
    options.c_cflag |= CLOCAL;    
    //修改控制模式,使得能夠從串口中讀取輸入數據    
    options.c_cflag |= CREAD;    

    //設置數據流控制    
    switch(flow_ctrl)    
    {    

        case 0 ://不使用流控制    
              options.c_cflag &= ~CRTSCTS;    
              break;       

        case 1 ://使用硬件流控制    
              options.c_cflag |= CRTSCTS;    
              break;    
        case 2 ://使用軟件流控制    
              options.c_cflag |= IXON | IXOFF | IXANY;    
              break;    
    }    
    //設置數據位    
    //屏蔽其他標志位    
    options.c_cflag &= ~CSIZE;    
    switch (databits)    
    {      
        case 5    :    
                     options.c_cflag |= CS5;    
                     break;    
        case 6    :    
                     options.c_cflag |= CS6;    
                     break;    
        case 7    :        
                 options.c_cflag |= CS7;    
                 break;    
        case 8:        
                 options.c_cflag |= CS8;    
                 break;      
        default:       
                 fprintf(stderr,"Unsupported data size\\n");    
                 return (RES_UART_FALSE);     
    }    
    //設置校驗位    
    switch (parity)    
    {      
        case 'n':    
        case 'N': //無奇偶校驗位。
                 options.c_cflag &= ~PARENB;     
                 options.c_iflag &= ~INPCK;        
                 break;     
        case 'o':      
        case 'O'://設置為奇校驗        
                 options.c_cflag |= (PARODD | PARENB);     
                 options.c_iflag |= INPCK;                 
                 break;     
        case 'e':     
        case 'E'://設置為偶校驗      
                 options.c_cflag |= PARENB;           
                 options.c_cflag &= ~PARODD;           
                 options.c_iflag |= INPCK;          
                 break;    
        case 's':    
        case 'S': //設置為空格     
                 options.c_cflag &= ~PARENB;    
                 options.c_cflag &= ~CSTOPB;    
                 break;     
        default:      
                 fprintf(stderr,"Unsupported parity\\n");        
                 return (RES_UART_FALSE);     
    }     
    // 設置停止位     
    switch (stopbits)    
    {      
        case 1:       
                 options.c_cflag &= ~CSTOPB; break;     
        case 2:       
                 options.c_cflag |= CSTOPB; break;    
        default:       
                       fprintf(stderr,"Unsupported stop bits\\n");     
                       return (RES_UART_FALSE);    
    }    

    //修改輸出模式,原始數據輸出    
    options.c_oflag &= ~OPOST;    

    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);    
    //options.c_lflag &= ~(ISIG | ICANON);    

    //設置等待時間和最小接收字符    
    options.c_cc[VTIME] = 1; /* 讀取一個字符等待1*(1/10)s */      
    options.c_cc[VMIN] = 1; /* 讀取字符的最少個數為1 */    

    //如果發生數據溢出,接收數據,但是不再讀取 刷新收到的數據但是不讀    
    tcflush(fd,TCIFLUSH);    

    //激活配置 (將修改后的termios數據設置到串口中)    
    if (tcsetattr(fd,TCSANOW,&options) != 0)      
    {    
        perror("com set error!\\n");      
        return (RES_UART_FALSE);     
    }    
    return (RES_UART_TRUE);     
}    











int uart_init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity)    
{    
    int err;    
    //設置串口數據幀格式    
    if (uart_config(fd,speed,flow_ctrl,databits,stopbits,parity) == RES_UART_FALSE)    
    {                                                             
        return RES_UART_FALSE;    
    }    
    else    
    {    
        return  RES_UART_TRUE;    
    }    
}    

int uart_read(int fd, char *rcv_buf,int data_len)    
{    
    int len,fs_sel;    
    fd_set fs_read;    

    struct timeval time;    

    FD_ZERO(&fs_read);    
    FD_SET(fd,&fs_read);    

    time.tv_sec = 10;    
    time.tv_usec = 0;    

    //使用select實現串口的多路通信    
    fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);    
    //printf("fs_sel = %d\\n",fs_sel);    
    if(fs_sel)    
    {    
        len = read(fd,rcv_buf,data_len);    
        return len;    
    }    
    else    
    {    
        return RES_UART_FALSE;    
    }         
}    


int uart_write(int fd, char *send_buf,int data_len)    
{    
    int len = 0;    

    len = write(fd,send_buf,data_len);    
    if (len == data_len )    
    {    
        printf("send data is %s\\n",send_buf);  
        return len;    
    }         
    else       
    {    

        tcflush(fd,TCOFLUSH);    
        return RES_UART_FALSE;    
    }    

}

6.1.2 測試代碼

#include "stdint.h"


#include "app_usart.h"
#include "app_config.h"
#include "rtservice.h"


#include "ful_communication.h"


#include      /*標準輸入輸出定義*/    
#include     /*標準函數庫定義*/    
#include     /*Unix 標準函數定義*/    
#include     
#include       
#include      /*文件控制定義*/    
#include    /*PPSIX 終端控制定義*/    
#include      /*錯誤號定義*/    
#include


#define SLOTS   "/sys/devices/bone_capemgr.9/slots"
#define CONFIG_SLOTS_UART_DEV "ADAFRUIT-UART4"
static int8_t s_read_firmware_version(uint32_t length, uint8_t *);
static int8_t s_config_baudrate(uint32_t length, uint8_t *);
extern void g_ful_com_detect_command(uint8_t checkData);
extern int8_t callback_register(action_t *obj);


int fd = -1;           //文件描述符,先定義一個與程序無關的值,防止fd為任意值導致程序出bug    


static action_t action_list[] =
{
    {CMD_READ_FW_VERSION,s_read_firmware_version},
    {CMD_CONFIG_BAUDRATE,s_config_baudrate},
};

static int8_t s_read_firmware_version(uint32_t length, uint8_t *pbuf)
{
    if(NULL == pbuf)
    {
        return -1;
    }


  printf("s_read_firmware_version length: [%d]\\n",length);
  printf("pbuf[0]=[%02x]\\n",pbuf[0]);


    if (3 == length)
    {
        uint8_t response_version[60]={0};


        sprintf(response_version,"%s_%s %s %s\\n",CONFIG_PRODUCT_NAME,CONFIG_FIRMWARE_VERSION,__DATE__,__TIME__);


        return uart_write(fd,response_version,strlen(response_version));
    }


    return 0;
}


static int8_t s_config_baudrate(uint32_t length, uint8_t *pbuf)
{
    if(NULL == pbuf)
    {
        return -1;
    }


    //if (3 == length)
    {
        uint32_t get_baudrate = (pbuf[1]<<24) | (pbuf[2]<<16) | (pbuf[3]<<8) | (pbuf[4]);


    printf("config baudrate to [%d]\\n",get_baudrate);

        int err = uart_init(fd,get_baudrate,0,8,1,'N');

    }


    return 0;
}




int main(int argc, char **argv)    
{
    int err;               //返回調用函數的狀態    
    int len;                            
    int i;    
    char rcv_buf[256];           

    if(argc != 2)    
    {    
        printf("Usage: %s /dev/ttySn      #1(receive data)\\n",argv[0]);
        printf("open failure : %s\\n", strerror(errno));

        return RES_UART_FALSE;    
    }  


    uint8_t action_index = 0;


    for (action_index=0;action_index<LENGTH_OF_ARRAY(action_list);action_index++)
    {
        callback_register(&action_list[action_index]);
    }

  int fd_drv_uart,count=0;

  //mount the Drive of Uart
  if ((fd_drv_uart = open(SLOTS, O_WRONLY)) < 0) 
  { 
    perror("SLOTS: Failed to open the file. \\n"); 
    return -1; 
  }

  printf("fd_drv_uart=%d\\n",fd_drv_uart); 

  if ((count = write(fd_drv_uart, CONFIG_SLOTS_UART_DEV,strlen(CONFIG_SLOTS_UART_DEV)))<0) 
  {
    perror("SLOTS:Failed to write to the file\\nFailed to mount the UART"); 
    //return -1; 
  }
    close(fd_drv_uart);

    fd = uart_open(fd,argv[1]); //打開串口,返回文件描述符    

    do  
    {    
        printf("uart_init fd=%d\\n",fd); 

        err = uart_init(fd,115200,0,8,1,'N');

    if (err>=0)
        {
            break;
        }
        printf("err=%d\\n",err); 

    uart_close(fd);     

    fd = uart_open(fd,argv[1]);
    }while(RES_UART_FALSE == err || RES_UART_FALSE == fd); 

    while (1) 
    {   
        len = uart_read(fd, rcv_buf,sizeof(rcv_buf));  
        if(len > 0)    
        {    
            int idx = 0;

            printf("receive data len=%d\\n",len);  

            for (idx=0; idxuint8_t ch = rcv_buf[idx];
                printf("%02x ",ch);  
        g_ful_com_detect_command(ch);
            }

            printf("\\n");  
        }    

        usleep(10000);   
    }         

    uart_close(fd);     
    close(fd_drv_uart);
}

6.1.3 生成文件

CFILE = $(wildcard  *.c)
  CFILE += $(wildcard functions/*.c)
  CFILE += $(wildcard app/*.c)
  DIRSRC += -I functions/include
  DIRSRC += -I app/include
all:
  @gcc $(CFILE) $(DIRSRC) -o u_app
#gcc *.c  -o  usart


.PHONY:clean
clean:  
  @-rm u_app

6.1.4 目錄結構

app
--include
--app_test.c
--app_uart.c
functions
--include
--fun_communication.c
Makefile
u_app

6.3 串口應用的開機自啟動
開機自啟動,運行在后臺,u_app需要添加可執行權限

cp u_app /usr/my_app
vim /etc/rc.local
./usr/my_app/u_app /dev/ttyO4 &   
exit 0

6.4 測試
可正常解析指令,返回結果

圖片

7 總結
用虛擬機來跑ubuntu總是不太穩定,如果不能進入桌面系統也不能進入tty控制臺基本上就要重裝了,還是得找個穩定的ubuntu鏡像才行呀。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11294

    瀏覽量

    209341
  • 串口
    +關注

    關注

    14

    文章

    1551

    瀏覽量

    76431
  • 開發板
    +關注

    關注

    25

    文章

    5033

    瀏覽量

    97375
  • 應用開發
    +關注

    關注

    0

    文章

    58

    瀏覽量

    9357
  • BB-Black
    +關注

    關注

    1

    文章

    15

    瀏覽量

    13197
收藏 人收藏

    評論

    相關推薦

    基于Linux環境串口通信的應用設計

    本文介紹了Linux環境串口通信的設計方法和步驟,并介紹了ARM9微處理器s3c2440在Linux和C8051Fxxx系列單片機進行串
    發表于 05-24 10:50 ?2836次閱讀

    【教程】Linux串口與工業協議開發 - 2

    Linux串口與工業協議開發2,視頻教程回復帖子查看資料下載鏈接:[hide][/hide]
    發表于 08-18 10:44

    【教程】Linux串口與工業協議開發 - 3

    Linux串口與工業協議開發3,視頻教程回復帖子查看資料下載鏈接:[hide][/hide]
    發表于 08-18 10:46

    【教程】Linux串口與工業協議開發 - 4

    Linux串口與工業協議開發4,視頻教程回復帖子查看資料下載鏈接:[hide][/hide]
    發表于 08-18 10:49

    【教程】Linux串口與工業協議開發 - 6

    Linux串口與工業協議開發6,視頻教程回復帖子查看資料下載鏈接:[hide][/hide]
    發表于 08-18 10:51

    Linux可用的串口助手在linux使用串口終端

    !!!如果使用的是虛擬機,確保串口設備掛載到虛擬機里!!!1.Linux可用的串口助手在linux
    發表于 11-05 08:48

    Linux串口編程下載

    linux 中的串口設備文件存放于/dev 目錄下,其中串口一,串口二對應設備名依次為/dev/ttyS0、/dev/ttyS1。在linux
    發表于 11-15 17:39 ?108次下載

    LinuxARM 和單片機的串口通信設計

     介紹Linux 環境串口通信的設計方法和步驟,并介紹了ARM9 微處理器s3c2440 在Linux 和C8051Fxxx 系列單片機
    發表于 05-24 10:16 ?3474次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>ARM 和單片機的<b class='flag-5'>串口</b>通信設計

    Linux串口編程入門

    嵌入式開發學習,關于Linux串口編程入門,感興趣的小伙伴可以瞧一瞧。
    發表于 11-03 15:15 ?0次下載

    串口編程參考資料 linux環境

    串口編程參考資料 linux環境
    發表于 10-24 14:39 ?8次下載
    <b class='flag-5'>串口</b>編程參考資料 <b class='flag-5'>linux</b>環境<b class='flag-5'>下</b>的

    基于WinCE_NET串口驅動開發設計

    基于WinCE_NET串口驅動開發設計
    發表于 10-25 09:54 ?3次下載
    基于WinCE_NET<b class='flag-5'>下</b><b class='flag-5'>串口</b>驅動<b class='flag-5'>開發</b>設計

    基于嵌入式linux系統串口編程具體設置詳解

    本文基于嵌入式linux串口應用編程進行了研究,詳細介紹了串口設置的步驟,可以更好的理解串口的工作原理。
    發表于 09-17 17:10 ?6983次閱讀

    嵌入式linux串口編程

    嵌入式開發——Linux串口編程筆記
    發表于 11-02 10:21 ?14次下載
    嵌入式<b class='flag-5'>linux</b><b class='flag-5'>串口</b>編程

    【嵌入式Linux(環境篇)】Linux串口助手 —— minicom或putty

    !!!如果使用的是虛擬機,確保串口設備掛載到虛擬機里!!!1.Linux可用的串口助手在linux
    發表于 11-02 12:50 ?10次下載
    【嵌入式<b class='flag-5'>Linux</b>(環境篇)】<b class='flag-5'>Linux</b><b class='flag-5'>下</b>的<b class='flag-5'>串口</b>助手 —— minicom或putty

    Linux開發板通過串口和PC文件傳輸

    Linux開發板通過串口和PC文件傳輸
    發表于 10-28 10:59 ?0次下載
    主站蜘蛛池模板: 欧美video巨大粗暴18| 国产36d在线观看| 伊人久久综合| 亚洲精品高清在线观看| 无人区尖叫之夜美女姐姐视频| 殴美黄色网| 欧美亚洲国内日韩自拍视频| 免费国产综合视频在线看| 久久噜国产精品拍拍拍拍| 精品人妻伦九区久久AAA片69 | 欧美性喷潮xxxx| 欧美高清vivoesond在线播放| 麻豆国产精品久久人妻| 麻豆精品乱码WWW久久密| 久久国产精品无码视欧美| 娇小8一12xxxx第一次| 精品国产自在自线官方| 娇喘嗯嗯 轻点啊视频福利| 精品无码国产自产在线观看水浒传| 激情内射亚洲一区二区三区| 国产综合视频在线观看一区| 好湿好紧水多AAAAA片秀人网| 国产在线精品亚洲一品区| 国产一区二区三区在线看片| 国产亚洲精品精品精品| 黑丝美女被人操| 麻豆XXXX乱女少妇精品-百度| 女bbbbxxx孕妇| 人驴交f ee欧美| 偷窥国产亚洲免费视频| 亚洲 无码 制服 日韩| 亚洲熟女片嫩草影院| 又色又爽又黄gif动态视频| 8x华人免费视频| 俄罗斯12x13x处| 国产亚洲精品久久久999密臂| 久草高清在线| 男人和女人一级黄色大片| 三级电影免费看| 亚洲乱码日产精品BD在线下载| 中文字幕精品在线观看|