www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]1 概述這兒說的串口包括兩種,232和485。其實(shí),二者沒有本質(zhì)的區(qū)別,驅(qū)動(dòng)都是一樣的,只是232是雙工,而485是半雙工。所以,485在正常情況下出于接收狀態(tài),一旦需要發(fā)送數(shù)據(jù)時(shí),需要設(shè)置對(duì)于的IO

1 概述
這兒說的串口包括兩種,232和485。其實(shí),二者沒有本質(zhì)的區(qū)別,驅(qū)動(dòng)都是一樣的,只是232是雙工,而485是半雙工。
所以,485在正常情況下出于接收狀態(tài),一旦需要發(fā)送數(shù)據(jù)時(shí),需要設(shè)置對(duì)于的IO的狀態(tài),使其出于發(fā)送狀態(tài)。
除此,沒有太多區(qū)別。下面已485為例具體總結(jié)。
2 打開串口
    fd = open("/dev/s3c2410_serial0", O_RDWR|O_NOCTTY|O_NDELAY);        
    if (fd < 0)
    {
        perror("rs485: open 485 device");
        return -1;
    }
? ?就像打開普通的文件一樣操作open。
? ?"/dev/s3c2410_serial0":是串口設(shè)備名
? ?O_RDWR:以可讀可寫的方式打開
? ?O_NOCTTY:不是控制終端控制的程序,否則,任何輸入都會(huì)影響該程序。具體沒有測(cè)試過,讓加就加上唄。
? ?O_NDELAY:不關(guān)心DCD信號(hào)線狀態(tài),即其他端口是否允許。否則,程序會(huì)在DCD信號(hào)線為低電平時(shí)停止。
? ? 目前,還不是很明白什么意思。暫時(shí)理解為設(shè)置為非阻塞狀態(tài)吧。
3 參數(shù)設(shè)置
串口的參數(shù)放在了結(jié)構(gòu)體struct termios中。
首先,需要獲取參數(shù)信息。
	  struct termios options;
	  if(tcgetattr( fd,&options)  !=  0)
	  {
	      perror("tcgetattr");
	      return -1;
	  }
然后,具體設(shè)置參數(shù)。這塊是下面重點(diǎn)說的。我們以9600,8,N,1為例。因?yàn)椋@是經(jīng)典的配置。
最后,保存新設(shè)置的參數(shù)。
	tcflush(fd,TCIFLUSH);
	if (tcsetattr(fd,TCSANOW,&options) != 0)
	{
	      perror("tcsetattr");
	      return -1;
	}
至此,參數(shù)設(shè)置完畢。
3.1 波特率
/*波特率9600*/
? ? cfsetispeed(&options, B9600);

? ? cfsetospeed(&options, B9600);

3.2 數(shù)據(jù)位

? /*數(shù)據(jù)位8*/
? ? options.c_cflag &= ~CSIZE;
? ? options.c_cflag |= CS8;
? ?設(shè)置數(shù)據(jù)位之前,必須先設(shè)置options.c_cflag &= ~CSIZE;
? ?作用是先屏蔽其他標(biāo)志,然后修改數(shù)據(jù)位。
3.3 奇偶校驗(yàn)
? ??/*奇偶校驗(yàn),無*/
? ? options.c_cflag &= ~PARENB;
? ? options.c_iflag &= ~INPCK;
3.4 停止位
? ??/*停止位,1*/
? ? options.c_cflag &= ~CSTOPB;
3.5 控制設(shè)置
? /*保證程序不會(huì)占用串口,并且可以能夠從串口中讀取輸入數(shù)據(jù)*/
? ? options.c_cflag |= (CLOCAL|CREAD);
? ? 這兩個(gè)標(biāo)記必須加上。
3.6 輸入輸出
? options.c_oflag &= ~OPOST;
? 當(dāng)OPOST不被使能,c_oflag的其他位也被忽略,效果相當(dāng)于c_oflag=0

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

3.7 等待時(shí)間

? ??/*設(shè)置等待時(shí)間*/
? ? options.c_cc[VTIME] = 0;?
? ? options.c_cc[VMIN] = 0;
? ? 關(guān)于這兩項(xiàng)設(shè)置,內(nèi)容挺多的,首先VTIME是設(shè)置等待時(shí)間,最小單位是0.1s;VMIN是設(shè)置等待字符數(shù)。
? ? 有四種情況,具體如下:
? ? VTIME=0,VMIN=0:read時(shí),有數(shù)據(jù)就讀,沒有就立馬返回。
? ? VTIME=1,VMIN=0:read時(shí),有數(shù)據(jù)時(shí)就讀,讀的過程中沒有延時(shí)。沒有數(shù)據(jù)時(shí),會(huì)阻塞0.1s,然后返回。
? ? VTIME=0,VMIN=5:read時(shí),有數(shù)據(jù)時(shí),讀到5個(gè)字節(jié),立馬返回。沒有數(shù)據(jù)時(shí),會(huì)一直阻塞著,非得等到那個(gè)字節(jié)的到來。
? ? VTIME=1,VMIN=5:read時(shí),有數(shù)據(jù)是,讀到一個(gè)字節(jié)后,才開始計(jì)時(shí),然后,如果時(shí)間到或已經(jīng)讀取了5個(gè)字節(jié),則返回。
? ? 沒有數(shù)據(jù)時(shí),會(huì)一直阻塞著等待字符的到來,此時(shí)時(shí)間不起作用,因?yàn)檫€沒有計(jì)時(shí)。
? ? 注意:只有在打開設(shè)備時(shí),設(shè)置為阻塞,即沒有設(shè)置O_NONBLOCK或O_NDELAY標(biāo)志,上面的情況才會(huì)有效。
上面的1和5只是為了方便說明而已。總體來說,只要設(shè)置了VMIN,在沒有數(shù)據(jù)可讀時(shí),就會(huì)一直阻塞。 ? ? ?
4 讀串口
關(guān)于讀串口,網(wǎng)上說了很多方式,有select查詢,軟中斷等。當(dāng)然,最終實(shí)際去讀的都是用read函數(shù)。
我采取的方式是先用select查詢是否有數(shù)據(jù)需要讀,然后,每次讀取一個(gè)字節(jié),再去用狀態(tài)機(jī)檢查該字節(jié)。這樣一來,不用考慮
每次讀取多少,以及是否讀全等問題。代碼如下:
    timeout.tv_sec = 0;
    timeout.tv_usec = 10000;
    FD_ZERO(&readfd);
    FD_SET(fd,&readfd);
    ret=select(fd+1,&readfd,NULL,NULL,&timeout);
    if(ret > 0)
    {
        if(FD_ISSET(fd,&readfd))
        {
            ret = read(fd, &cmd, 1);
            if(ret > 0)
            {
                /*有信息,則去處理信息*/
            }
        }
    }
? ? 處理信息函數(shù)根據(jù)當(dāng)前狀態(tài)處理該字節(jié),并進(jìn)入下一狀態(tài)。
? ? 目前,不太確定加上select和直接用來read哪個(gè)效率高,有沒有必要加select。
5 寫串口
按說串口的寫只是用一個(gè)write函數(shù)即可實(shí)現(xiàn)的。但是,現(xiàn)在是485串口,寫串口時(shí),需首先更改串口狀態(tài)。
下面重點(diǎn)說明一下如何更改串口狀態(tài)。
5.1 /sys/class/gpio
它是gpio到文件系統(tǒng)的映射,通過操作里面的文件,可以直接操作gpio。
首先,查看系統(tǒng)中有沒有/sys/class/gpio目錄。
如果沒有,需要在配置內(nèi)核時(shí)加上Device Drivers —> GPIO Support —> /sys/class/gpio/。
5.2 文件介紹
該目錄下有export和unexport兩個(gè)可寫文件和其他的類似gpiochip146的軟連接。
export:通知系統(tǒng)需要導(dǎo)出控制的GPIO引腳編號(hào)。
unexport:通知系統(tǒng)取消導(dǎo)出。
gpiochip146:保存系統(tǒng)中GPIO寄存器的信息。該目錄在/sys/devices/virtual/gpio/gpiochip146
目錄下有l(wèi)abel、base、ngpio、subsystem、uevent。代表的意義如下:
label:設(shè)備信息,如cat label,得到的是GPH2
base:設(shè)備所管理的gpio初始編號(hào),如cat base,得到的是146
ngpio:設(shè)備所管理的gpio總是,如cat ngpio,得到的是8,
即該gpiochip146管理從146到153這8個(gè)gpio接口
subsystem:符號(hào)鏈接,指向父目錄
uevent:內(nèi)核與udev(自動(dòng)設(shè)備發(fā)現(xiàn)程序)之間的通信接口
5.3 導(dǎo)出GPIO接口
首先,需要計(jì)算出引腳編號(hào)。
引腳編號(hào) = 控制引腳的寄存器基數(shù) + 控制引腳寄存器位數(shù)
該引腳即是控制485狀態(tài)轉(zhuǎn)換的引腳。根據(jù)具體的硬件連接來定,我的是146。
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "146", 3);
導(dǎo)出成功后,會(huì)在當(dāng)前目錄下生成新的目錄gpio146。
5.4 gpio146
該目錄下會(huì)有幾個(gè)個(gè)文件,其中有value、direction和active_low
direction:具有讀寫屬性,控制GPIO接口的輸入輸出方向。
如果將"out"寫入該文件,該GPIO接口為輸出狀態(tài);
如果將"in"寫入該文件,該GPIO接口為輸入狀態(tài);
如果將"high"寫入該文件,那么在將GPIO接口置為輸出狀態(tài)的同時(shí),也將value的值置為"1";
如果將"low"寫入value
當(dāng)GPIO的方向?yàn)檩斎霑r(shí),可以通過v文件,那么在將GPIO接口置為輸出狀態(tài)的同時(shí),將"0"寫入value文件。
通過對(duì)direction文件的讀操作還可以判斷當(dāng)前GPIO接口的輸入/輸出狀態(tài)("in"/"out")。
value:具有讀寫屬性,表示當(dāng)前GPIO接口的電平狀態(tài)。
當(dāng)GPIO的方向?yàn)檩斎霑r(shí),可以通過value讀出當(dāng)前GPIO接口的電平狀態(tài)高低("1"/"0",均以ASCII碼表示);
當(dāng)GPIO方向?yàn)檩敵鰰r(shí),可以向該文件寫入"1"/"0",控制當(dāng)前GPIO接口的高/低電平。
active_low:具有讀寫屬性,值為"0"或"1",用于決定value中的值是否進(jìn)行翻轉(zhuǎn)。
當(dāng)值為"0"時(shí),value中的"0"表示低電平,"1"表示高電平;
當(dāng)值為"1"時(shí),value中的"1"表示低電平,"0"表示高電平。
5.5 輸出
設(shè)置引腳為輸出方向。
fd = open("/sys/class/gpio/gpio146/direction", O_WRONLY); ?
write(fd, "out", 3);
5.6 發(fā)送模式
fd = open("/sys/class/gpio/gpio146/value", O_WRONLY); ?
write(fd, "1", 1);
此處高低根據(jù)硬件情況來。
5.7 取消導(dǎo)出
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "146", 3);
5.8 接收模式
發(fā)送完之后,需等待一會(huì),然后再設(shè)置成接收模式。
這個(gè)時(shí)間我暫時(shí)設(shè)置成usleep(1000*len);
len:發(fā)送數(shù)據(jù)的長度。
fd = open("/sys/class/gpio/gpio146/value", O_WRONLY);
write(fd, "0", 1);
6 總結(jié)
232的操作比這簡單,寫時(shí)不需要再通過GPIO來更改狀態(tài)了。
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉