天天看點

Linux——樹莓派——序列槽通信參考博文序列槽通信的工作方式一、常用API樹莓派向電腦序列槽每隔1s發送一個字元c發送資料 傳回字元串

文章目錄

  • 參考博文
  • 序列槽通信的工作方式
    • 序列槽通信注重什麼
  • 一、常用API
    • 初次使用需要配置
  • 樹莓派向電腦序列槽每隔1s發送一個字元c
    • 運作程式,打開PC序列槽調試助手
  • 發送資料 傳回字元串

參考博文

https://www.cnblogs.com/lulipro/p/5992172.html

序列槽通信的工作方式

全雙工允許通信雙方同時互傳資料;半雙工不可同時,一方發送時,另一方隻能接收。序列槽通信屬于全雙工。

序列槽通信注重什麼

  • 資料格式

    資料位,停止位,奇偶校驗位

  • 波特率

    波特率(Baud Rate) 機關 bps – 每秒傳送的 位元組數 Byte Per Second.。

波特率(Baud Rate) 機關 bps – 每秒傳送的 位元組數 Byte Per Second.。

一、常用API

包含頭檔案#include <wiringSerial.h>

函數 參數 作用
int serialOpen (char *device, int baud) device:序列槽的位址,即裝置所在的目錄。預設"/dev/ttyAMA0" 傳回值:正常傳回檔案描述符,否則傳回-1失敗。 打開并初始序列槽
int serialDataAvail(int fd) 傳回:序列槽緩存中已經接收的,可讀取的位元組數,-1代表錯誤 擷取序列槽緩存中可用的位元組數。
void serialPutchar (int fd, unsigned char c) c:要發送的資料 發送一個位元組的資料到序列槽
void serialPuts (int fd, char *s) s:發送的字元串,字元串要以’\0’結尾 發送一個字元串到序列槽
int serialGetchar (int fd) 傳回:讀取到的字元 從序列槽讀取一個位元組資料傳回。如果序列槽緩存中沒有可用的資料,則會等待10秒,如果10後還沒有,傳回-1。是以在讀取前,通過serialDataAvail判斷。

初次使用需要配置

cd /boot/
sudo vim cmdline.txt
           

删除字元串”console=ttyAMA0,115200“

解除序列槽用于資訊的列印,列印啟動字元以及一些調試界面等。目的是把序列槽用于正常的資料通信

②重新開機

sudo reboot

樹莓派向電腦序列槽每隔1s發送一個字元c

#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>

int main()
{
        int fd;
        if(-1 == wiringPiSetup()){
                printf("硬體初始化失敗\n");
        }

        fd = serialOpen("/dev/ttyAMA0",9600);

        while(1){
                serialPutchar(fd,'c');
                delayMicroseconds(1000000);

        }
        return 0;
}

           

運作程式,打開PC序列槽調試助手

Linux——樹莓派——序列槽通信參考博文序列槽通信的工作方式一、常用API樹莓派向電腦序列槽每隔1s發送一個字元c發送資料 傳回字元串

發送資料 傳回字元串

#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>

int main()
{
        int fd;
        int cmd;

        wiringPiSetup();  //硬體初始化

        fd = serialOpen("/dev/ttyAMA0",9600); //和檔案描述符很像 先打開序列槽 波特率9600 後續操作用fd

        while(1){
                while(serialDataAvail(fd)!= -1){  //先判斷序列槽是否有資料 沒有就阻塞  有的話傳回值非-1 進入循環
                        cmd = serialGetchar(fd);  //cmd接受得到的字元
                        if(cmd == '1'){  //根據字元 輸出相應内容
                                serialPuts(fd,"haha1\r\n");
                        }else if(cmd=='2'){
                                serialPuts(fd,"haha2\r\n");
                        }else if(cmd=='3'){
                                serialPuts(fd,"haha3\r\n");
                        }
                
                }
                
       }
        
        return 0;
}
           

繼續閱讀