CodeSys中編程實現串口通訊【基於樹莓派4B】

来源:https://www.cnblogs.com/zhw618/archive/2022/07/21/16502058.html
-Advertisement-
Play Games

第一步:Linux中啟用串口設備。【以樹莓派4B為例】 樹莓派4B有6個串口,參考上一篇《樹莓派4B串口配置與開發》,在 /boot/config.txt 中添加一行,開啟 uart2 功能: dtoverlay=uart2 重啟後,查看是否有多出來一個 /dev/AMA1 設備: $ ls -l ...


第一步:Linux中啟用串口設備。【以樹莓派4B為例】

   樹莓派4B有6個串口,參考上一篇《樹莓派4B串口配置與開發》,在 /boot/config.txt 中添加一行,開啟 uart2 功能:

  dtoverlay=uart2

   重啟後,查看是否有多出來一個 /dev/AMA1 設備:

$ ls -l  /dev/tty*
crw-rw---- 1 root dialout 204, 64 Jul 20 11:52 /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 65 Jul 20 11:59 /dev/ttyAMA1
crw------- 1 root root      5,  3 Jul 20 11:52 /dev/ttyprintk
crw--w---- 1 root tty       4, 64 Jul 20 11:52 /dev/ttyS0

  也可以config.txt 中添加多行(uart2,uart3,uart4,uart5)啟動多個串口功能 (對應 ttyAMA1,ttyAMA2,ttyAMA3 和 ttyAMA4).

可以用下麵命令查看 uart2 對應的GPIO針腳映射:

# dtoverlay -h  uart2 

Name:   uart2

Info:   Enable uart 2 on GPIOs 0-3. BCM2711 only.

Usage:  dtoverlay=uart2,<param>

Params: ctsrts                  Enable CTS/RTS on GPIOs 2-3 (default off)

從輸出可見,GPIO針腳為0-3, 其中針腳0和1分別為TxD和RxD,針腳2-3為流控 CTS/RTS.  此處針腳0-1為BCM編碼號物理引腳號為27-28.

 

第二步: 使用python代碼,測試 uart2 功能是否正確

   硬體接線: 將 GPIO引腳0 和 1 短接,實現自發自收

   軟體測試:python控制臺中,執行如下代碼測試

>>> import serial
>>> ted = serial.Serial(port="/dev/ttyAMA1", baudrate=9600)
>>> ted.write("Hello World".encode("gbk"))
11
>>> ted.read(11)
b'Hello World'
>>>

能收到字串‘Hello World’表示 uart2 功能和接線均一切正常。

 

第三步:編輯 CodeSys 配置文件,映射 /dev/ttyAMA* 到 COMx 埠號。

   在老版本的CodeSys 中,需要編輯 "/ect/CODESYSControl.cfg" 末尾添加:

[SysCom]
Linux.Devicefile = /dev/ttyUSB
portnum := COM.SysCom.SYS_COMPORT1;

這樣,在codesys中指定串口號1,代表使用的設備為 /dev/ttyUSB0, 非常不直觀。

從codesys v3.5 SP15 起(據說),改為在文件 /etc/CODESYSControl_User.cfg 里這麼設置:

[SysCom]
Linux.Devicefile.1=/dev/ttyS0
Linux.Devicefile.2=/dev/ttyAMA1
Linux.Devicefile.4=/dev/ttyUSB0

這樣, Com1 即為 ttyS0, Com2即為 ttyAMA1, Com4 即為 ttyUSB0,依次類推。支持多個串口,方便多了。 

如上面設置,映射關係 uart2 --> ttyAMA1 --->  Com2, 所以codesys中指定埠號為 2 (即Com2)即可。 

 

第四步: CodeSys中編程實現串口收發功能

     參考 youtube 上的學習視頻: https://www.youtube.com/watch?v=NFREG2U07Rg

      只需參考codesys編程部分即可,代碼我在他基礎上又做了修改完善,

(1)程式塊導入3個庫: Memory, Serial Communication, Util

(2)定義部分

PROGRAM SerialPort
VAR
    (*打開埠部分*)
	Open_0: COM.Open;
	Open_xExecute: BOOL := TRUE;   //預設打開埠
	aParams : ARRAY [1..7] OF COM.PARAMETER := [
        (udiParameterId := COM.CAA_Parameter_Constants.udiPort,             udiValue := 2),
    	(udiParameterId := COM.CAA_Parameter_Constants.udiBaudrate,         udiValue := 9600),
    	(udiParameterId := COM.CAA_Parameter_Constants.udiParity,           udiValue := INT_TO_UDINT(COM.PARITY.NONE) ),
    	(udiParameterId := COM.CAA_Parameter_Constants.udiStopBits,         udiValue := INT_TO_UDINT(COM.STOPBIT.ONESTOPBIT) ),
   		(udiParameterId := COM.CAA_Parameter_Constants.udiTimeout,          udiValue := 0),
    	(udiParameterId := COM.CAA_Parameter_Constants.udiByteSize,         udiValue := 8),
    	(udiParameterId := COM.CAA_Parameter_Constants.udiBinary,           udiValue := 0)
    ];
	hCom: CAA.HANDLE;
	
    (* read模塊 *)
	BLINK0: BLINK;
	Read_0: COM.Read;
	bReadData : ARRAY[1..80] OF BYTE;
	read_szSize: CAA.SIZE;
	
	sReadData : STRING;
	
	(* write模塊 *)
	Write_0: COM.Write;
	write_xExecute: BOOL;  //執行write操作
	bWriteData : ARRAY[1..80] OF BYTE;
	sWriteData : STRING;
	sWriteDataLast : STRING;  //上一次 Write值
END_VAR

(3)梯形圖部分

  先要 打開串口 (串口參數在定義部分已預設定):

註意此處,參數 xExecute 需始終為 True,否則 會關閉串口 hCom=0 !

讀串口部分的代碼:

使用 blink 定期讀取,讀出的內容放到數組 bReadData 中,讀出長度為 read_szSize.

為了防止讀入空(讀出為空是常態,有內容 是少數)時 覆蓋掉前面值,非空時才拷貝和更新到某個string,代碼如下:

這樣,僅在有新內容讀出時,才更新值到 sReadData 中。末尾的 MEM.MemFill() 用於寫入 string 的結束字元 '\0' .

下麵到了 寫串口 的部分。基本思路也是差不多,字元串中有新值時,才將 字元串內容 拷貝到 數組中用於寫出,並使能一次寫動作,代碼如下:

之後開始真正的 串口寫 動作:

代碼後半行,如果寫成功,就把此次內容保存到 sWriteDataLast 字串里,用於下一次比較,內容不同時才觸發一次 COM.Write() 寫動作。

需要註意的是,若寫動作發生error,會一直卡住 不更新 sWriteDataLast,所以加上並聯條件 Write_0.xError , 不管成功/Error失敗 均結束此次寫動作!就算寫失敗,想再一次嘗試,也必須將 sWriteData 改為其他才能再次觸發 寫動作。

(4)CodeSys中測試串口讀寫功能

   若串口正確打開, 則 hCom 的值非空,否則 hCom=0 表示失敗。

   blink產生的信號定時讀一遍數據,有新內容顯示在字串 sReadData 中;

   字串 sWriteData 中的內容會通過串口寫出去,只有更新 sWriteData 值的瞬間才會觸發一次寫操作,不管是否寫出成功。

 

以上代碼,使用 樹莓派4B, Codesys 3.5.18.2 ,Codesys Control for Linux ARM64 SL 測試通過。

使用樹莓派 自帶的 uart2 (ttyAMA1)和  usb轉ttl串口(ttyUSB0) 均測試通過。

 

附:  codesys工程源碼(下載改尾碼為zip)

                         2022-07-21

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 常用慢查詢分析工具 引言 在日常的業務開發中 MySQL 出現慢查詢是很常見的 大部分情況下會分為兩種情況 1、業務增長太快 2、要麼就是SQL 寫的太xx了 所以 對慢查詢 SQL 進行分析和優化很重要 其中 mysqldumpslow 是 MySQL 服務自帶的一款很好的分析調優工具 3.1 調 ...
  • 介紹 env_logger 配合 log 庫使用, log 是rust日誌庫的外觀庫,給日誌庫提供抽象的記錄介面, log使用巨集,如info!() trace!()記錄日誌 假如需要替換當前使用的日誌庫,只需將初始化相關的代碼和toml文件修改 env_logger 通過配置環境變數中 RUST_L ...
  • 此問題全網找了很久,也困擾了我很久,始終沒有找到解決方法。今天結合網上其他問題的帖子,自己研究的半天,終於找到了這個解決方法,經親自測試可行。歡迎大牛指導指正。 有時客戶收藏的系統地址是認證端的,然後登錄之後會轉向https://***:101/signin-oidc 報以下錯誤 An unhand ...
  • 一、項目說明 NewLife.Redis.Core基於新生命團隊NewLife.Redis的封裝,支持.NETCore3/.NET5/.NET6。 NewLife.Redis 是一個Redis客戶端組件,以高性能處理大數據實時計算為目標。 源碼: https://github.com/NewLife ...
  • VisualSVN是Visual Studio的專業Subversion集成插件,集成了Subversion和Apache簡化了手工配置Subversion的繁瑣步驟。 ...
  • 一、簡介 Docker Hub作為Docker預設官方公共鏡像,如果想要自己搭建私有鏡像,Harbor是企業級鏡像庫非常好的選擇。 所謂私有倉庫,也就是在本地(區域網)搭建的一個類似公共倉庫的東西,搭建好之後,我們可以將將鏡像提交到私有倉庫中。這樣我們既能使用Docker來運行我們的項目鏡像, 也避 ...
  • 在.Net Framework環境下,我們使用Windows Workflow Foundation(WF)作為項目的工作流引擎,可是.Net Core已經不支持WF了,需要為基於.Net Core的項目選擇新的工作流引擎。基本要求如下: 輕量級,部署和使用都很簡單。 有相當數量的用戶,往往使用的人 ...
  • Linux中的進程 進程:已經啟動的可執行程式的運行實例 1、PID:進程的ID(每一個新進程都有一個唯一的PID) 2、PPID:父進程的ID 3、任何一個進程都可以創建一個子進程 4、在redhat 7以上,所有進程的父進程: systemd 在redhat 5,6中,所有進程的父進程: ini ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...