1、goroutine:在go語言中,每一個并發的執行單元叫做goroutine,如果一個程序中包含多個goroutine,對兩個函數的調用則可能發生在同一時刻
石鼓ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
2、main goroutine:當一個程序啟動時,其主函數即在一個單獨的goroutine中運行,我們叫他為main gorountine
3、go goroutine:新的goroutine會用go語句來創建,go+函數名,go語句會使其語句中的函數在一新創建的goroutine中運行,而go語句本身會迅速地完成
4、goroutine的退出:主函數返回時,所有的goroutine都會被直接打斷,程序退出,除了從主函數退出或者終止程序之外,沒有其他方法能夠讓一個goroutine來打斷另一個的執行,但是可以通過另一種方式來實現這個目的,通過goroutine之間的通信來讓一個goroutine請求其他的goroutine,并讓請求的goroutine自行結束執行
首先你應該建立一個WIN32程序項目,而不是控制臺項目。在添加這些代碼:#include#include#include#include#definepi3.1415LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數說明//--------------------以下初始化窗口類-----------------//intWINAPIWinMain(HINSTANCEhInstance,//WinMain函數說明HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName[]="窗口";//窗口類名charlpszTitle[]="窗口示例程序";//窗口標題名//窗口類的定義wndclass.style=0;//窗口類型為默認類型wndclass.lpfnWndProc=WndProc;//窗口處理函數為WndProcwndclass.cbClsExtra=0;//窗口類無擴展wndclass.cbWndExtra=0;//窗口實例無擴展wndclass.hInstance=hInstance;//當前實例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//使用默認圖標wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口采用箭頭光標wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景為白色wndclass.lpszMenuName=NULL;//窗口中無菜單wndclass.lpszClassName=lpszClassName;//窗口類名為“窗口示例”//--------------------以下進行窗口類的注冊-------------if(!RegisterClass(wndclass))//若注冊失敗則發出警告聲音{MessageBeep(0);returnFALSE;}//創建窗口操作hwnd=CreateWindow(lpszClassName,//窗口類名lpszTitle,//窗口實例的標題名WS_OVERLAPPEDWINDOW,//窗口的風格CW_USEDEFAULT,CW_USEDEFAULT,//窗口左上角的坐標為默認值CW_USEDEFAULT,CW_USEDEFAULT,//窗口的高和寬為默認值NULL,//此窗口無父窗口NULL,//此窗口無主菜單hInstance,//應用程序的當前句柄NULL);//不使用該值ShowWindow(hwnd,nCmdShow);//顯示窗口UpdateWindow(hwnd);//繪制用戶區while(GetMessage(Msg,NULL,0,0))//消息循環{TranslateMessage(Msg);DispatchMessage(Msg);}returnMsg.wParam;//程序終止時將信息返回系統}//窗口函數LRESULTCALLBACKWndProc(HWNDhWnd,UINTiMessage,WPARAMwParam,LPARAMlParam){switch(iMessage){//此處添加消息處理代碼}switch(iMessage){caseWM_DESTROY:PostQuitMessage(0);//調用該函數發出WM_QUIT消息default:returnDefWindowProc(hWnd,iMessage,wParam,lParam);}return0;}
用到的gomodbus包是壇友slzm40編寫和共享的,感謝他的無私分享,本帖只是拋磚引玉,將我自己學習的一些經歷分享給大家;有關modbus包可以直接向slzm40請教或一起討論;
包地址"github.com/thinkgos/gomodbus";
添加一對虛擬串口
打開modbus-slave從機軟件,用來測試從機;
需要注意設置通信地址和讀取寄存器的地址和數量;
查看可用串口,因為虛擬串口選擇com1和com2,虛擬中我選擇使用/dev/ttyS1
編譯運行,會提示串口打開失敗,這是因為linux對設備的權限做了限制
獲取串口讀寫、運行等權限
我們已經能正確讀取03寄存器的值;其他功能可以自行測試;
package main
import (
"fmt"
modbus "github.com/thinkgos/gomodbus"
"github.com/thinkgos/gomodbus/mb"
"time"
)
func main(){
//調用RTUClientProvider的構造函數,返回結構體指針
p := modbus.NewRTUClientProvider()
p.Address = "/dev/ttyS1"
p.BaudRate = 115200
p.DataBits = 8
p.Parity = "N"
p.StopBits = 1
p.Timeout = 100 * time.Millisecond
client := mb.NewClient(p)
client.LogMode(true)
err := client.Start()
if err != nil {
fmt.Println("start err,", err)
return
}
for {
value, err := client.ReadHoldingRegisters(1, 1, 3)
if err != nil {
fmt.Println("readHoldErr,", err)
} else {
fmt.Printf("%#v\n", value)
}
time.Sleep(time.Second * 3)
}
}
作為一個測試,作為一個測試開發, 全棧化+管理 是我們未來的發展方向。已經掌握了Java、Python、HTML的你,是不是也想了解下最近異常火爆的Go語言呢?來吧,讓我們一起了解下。
Go 是一個開源的編程語言 ,它能讓構造簡單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發,后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發布了Go 1穩定版本。現在Go的開發已經是完全開放的,并且擁有一個活躍的社區。這三個人都是計算機界的大神,有的參與了C語言的編寫,有的還是數學大神,有的還獲得了計算機最高榮譽-圖靈獎。
接下來說說 Go語言的特色 :
簡潔、快速、安全
并行、有趣、開源
內存管理、數組安全、編譯迅速
Go語言的用途 :
Go 語言被設計成一門應用于搭載 Web 服務器,存儲集群或類似用途的巨型中央服務器的系統編程語言。
對于高性能分布式系統領域而言,Go 語言無疑比大多數其它語言有著更高的開發效率。它提供了海量并行的支持,這對于 游戲 服務端的開發而言是再好不過了。
Go語言的環境安裝:
建議直接打開 官方地址因為墻的原因打不開
因為我用的是windows系統,這里主要講下Windows系統上使用Go語言來編程。
Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.17.2.windows-amd64.msi)的安裝包來安裝。
默認情況下 .msi 文件會安裝在 c:Go 目錄下。你可以將 c:Gobin 目錄添加到 Path 環境變量中。添加后你需要重啟命令窗口才能生效。個人建議還是安裝到 Program Files文件夾中。
使用什么開發工具來對Go語言進行編寫:
個人建議用VS code, 也可以用Sublime Text來編輯。如果你之前看了我講的HTML語言的學習,肯定已經下載了VS code. 那么這時你需要在VS code中下載Go語言的擴展插件。
這里有一個巨大的坑,就是在下載Go的插件和依賴包時,會提示一些包沒有。主要是因為下載的依賴包部分被墻了,只能想別的辦法去下載。
建議參考網頁:
解決vscode中golang插件安裝失敗方法
在學習go的過程中,使用的是vscode,但是一直提示安裝相關插件失敗,然后上網查方法,基本上是叫你建立golang.org目錄什么的,結果全是錯的,而且都是抄襲,很煩。無意之中看到一位博主分享的方法,他也是飽受上述的垃圾博文困擾,然后找到了解決方法,這里向他致敬,秉著讓更多人看到正確解決方法的心,我寫下正確的解決方法,希望對你有所幫助,也可以點開原博主鏈接參考:
Go有一個全球模塊代理,設置代理再去安裝golang的插件,就可以安裝成功了。步驟有,首先Windows用戶打開Powershell,一個藍色的界面,注意不是cmd!不知道的直接打開window下面的搜索,然后輸入powershell,搜索出來就可以了。
$env:GO111MODULE=“on”
$env:GOPROXY=“”
go env -w GOPROXY=
go env -w GOPRIVATE=*.corp.example.com
然后我們打開VsCode界面,下面會提示安裝插件,我們選擇Install ALL,就會安裝成功
當你在運行Go語言程序時,提示所有的插件包都已經安裝成功了時,就可以正常使用了,要不然一堆報錯會讓你非常心煩。
好了,今天先到這里,晚安、下班~
//創建一個串口通訊 SerialPort CurrentPort = null; CurrentPort = new SerialPort(); CurrentPortReadBufferSize = 128; CurrentPortPortName = comName; //端口號 CurrentPortBaudRate = bandRate; //比特率 CurrentPortParity =parity;/go語言做串口通信,我應該從什么地方入手,IO是什
要求用什么語言?
------------------------------
網友“星心晨夢”的回答,是可以滿足題目要求的。
我實驗了,是成功的,沒有任何錯誤。
樓主應該檢查自己的電路、串口設置等等。
------------------------------
網友“星心晨夢”的回答,篇幅稍稍長了一些。
縮減一半就可以正常工作了,可讀性更好一些。
建議看看下面的。
------------------------------
#include AT89X51.h
#include intrins.h
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------------
uchar idata trdata1[] = {
'W','E','L','C','O','M','E',' ','T','O',' ','C','H','I','N','A','!',0x0d,0x0a,0x00};
uchar idata trdata2[] = {
'M','Y',' ','N','A','M','E',' ','I','S',' ','L','I','M','I','N','G',0x0d,0x0a,0x00};
uchar idata trdata3[] = {
'Y','I','N','G','Y','O','N','G','K','E','X','U','E','X','U','E','Y','U','A','N',0x0d,0x0a,0x00};
uchar RxBuf[5], Rx_p, Rx_i, TX_p, Tx_i;
//---------------------------------------------------
void UART_Init(void) //串口初始化
{
PCON = 0x00;
SCON = 0x50; //串口工作方式為1,允許接收.
TMOD = 0x20; // T1 定時方式2
TH1 = 0xfd; //波特率 9600bps @ fosc = 11.0592MHz
TL1 = 0xfd;
TR1 = 1; //啟動T1
ES = 1; //開串口中斷.
EA = 1; //開總中斷.
}
//---------------------------------------------------
void main()
{
UART_Init();
Rx_p = 0;
Rx_p = 2;
while(1) {
if (Rx_p != 0) {
TX_p = Rx_p;//字符串1 2 3
Tx_i = 0; //字符指針.
Rx_p = 0; //清零.
Rx_i = 0;
TI = 1; //啟動發送中斷.
} }
}
//---------------------------------------------------
void Uart_INT(void) interrupt 4 //串口中斷函數
{
uchar Tcv = 0;
if(RI) { //接收?.
RI = 0; //標志位清零.
RxBuf[Rx_i] = SBUF;
if((RxBuf[Rx_i - 1] == 'g') (RxBuf[Rx_i] == 'o')) Rx_p = 1;
if((RxBuf[Rx_i - 2] == 'w') (RxBuf[Rx_i - 1] == 'h') (RxBuf[Rx_i] == 'o')) Rx_p = 2;
if((RxBuf[Rx_i - 3] == 'h') (RxBuf[Rx_i - 2] == 'o') (RxBuf[Rx_i - 1] == 'm') (RxBuf[Rx_i] == 'e')) Rx_p = 3;
P1 = Rx_p; //在P1顯示收到的信息.
Rx_i++;
Rx_i %= 5;
}
else {
TI = 0;
if (TX_p == 1) Tcv = trdata1[Tx_i]; //取來待發字符.
if (TX_p == 2) Tcv = trdata2[Tx_i];
if (TX_p == 3) Tcv = trdata3[Tx_i];
if (Tcv != 0) {SBUF = Tcv; Tx_i++;} //不是0就發送.
}
}
//---------------------------------------------------
本文題目:go語言串口通信界面,go 串口開發
本文路徑:http://vcdvsql.cn/article16/hecsgg.html
成都網站建設公司_創新互聯,為您提供定制網站、手機網站建設、網站維護、商城網站、服務器托管、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯