下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
linux下的串口通信程序詳解2009-07-1912:37為了說明問題,下面給出測試程序來理解linux下的串口操作流程,例程receive.c用來接收從串口發(fā)來的數(shù)據(jù),而例程send.c用來發(fā)送數(shù)據(jù)到串口。二者成功建立串口連接后,串口接收端會收到串口發(fā)送端發(fā)來的字符串?dāng)?shù)據(jù)“Hello,thisisaSerialPorttest!”。
1.receive.c程序清單:\o"viewplain"viewplain/*******************************************************
*ilename:receive.c
*
Description:Receive
data
from
Serial_Port
*
Date:
*******************************************************/
/*********************頭文件定義***********************/
#include
<stdio.h>
#include
<string.h>
#include
<malloc.h>
#include
<sys/types.h>
#include
<sys/stat.h>
#include
<fcntl.h>
#include
<unistd.h>
#include
<termios.h>
#include
"math.h"
#define
max_buffer_size
100
/*定義緩沖區(qū)最大寬度*/
/*********************************************************/
int
fd,s;
int
open_serial(int
k)
{
if(k==0)
/*串口選擇*/
{
fd
=
open("/dev/ttyUSB0",O_RDWR|O_NOCTTY);
/*讀寫方式打開串口*/
perror("open
/dev/ttyUSB0");
}
else
{
fd
=
open("/dev/ttyS1",O_RDWR|O_NOCTTY);
perror("open
/dev/ttyS1");
}
if(fd
==
-1)
/*打開失敗*/
return
-1;
else
return
0;
}
/********************************************************************/
int
main()
{
char
hd[max_buffer_size],*rbuf;
/*定義接收緩沖區(qū)*/
int
flag_close,
retv,i,ncount=0;
struct
termios
opt;
int
realdata=0;
/*******************************************************************/
open_serial(0);
/*打開串口1*/
/*******************************************************************/
tcgetattr(fd,&opt);
cfmakeraw(&opt);
/*****************************************************************/
cfsetispeed(&opt,B9600);
/*波特率設(shè)置為9600bps*/
cfsetospeed(&opt,B9600);
/*******************************************************************/
tcsetattr(fd,TCSANOW,&opt);
rbuf=hd;
/*數(shù)據(jù)保存*/
printf("ready
for
receiving
data.../n");
retv=read(fd,rbuf,1);
/*接收數(shù)據(jù)*/
if(retv==-1)
{
perror("read
bad1");
/*讀狀態(tài)標(biāo)志判斷*/
}
/*************************開始接收數(shù)據(jù)******************************/
while(*rbuf!='/n')
/*判斷數(shù)據(jù)是否接收完畢*/
{
ncount+=1;
rbuf++;
retv=read(fd,rbuf,1);
if(retv==-1)
{
perror("read
bad2");
}
}
/*******************************************************************/
printf("The
data
received
is:/n");
/*輸出接收到的數(shù)據(jù)*/
for(i=0;i<ncount;i++)
{
printf("%c",hd[i]);
}
printf("/n");
flag_close
=close(fd);
if(flag_close
==
-1)/*判斷是否成功關(guān)閉文件*/
printf("Close
the
Device
failur!/n");
return
0;
}
/****************************結(jié)束***********************************/
2.send.c程序清單\o"viewplain"viewplain/*******************************************************
*
File
Name:
send.c
*
Description:
send
data
to
serial_Port
*
Date:
*******************************************************/
/******************頭文件定義******************/
#include
<stdio.h>
#include
<string.h>
#include
<malloc.h>
#include
<sys/types.h>
#include
<sys/stat.h>
#include
<fcntl.h>
#include
<unistd.h>
#include
<termios.h>
#define
max_buffer_size
100
/*定義緩沖區(qū)最大寬度*/
/*******************************************/
int
fd;
/*定義設(shè)備文件描述符*/
int
flag_close;
int
open_serial(int
k)
{
if(k==0)
/*串口選擇*/
{
fd
=
open("/dev/ttyUSB0",O_RDWR|O_NOCTTY);
/*讀寫方式打開串口*/
perror("open
/dev/ttyUSB0");
}
else
{
fd
=
open("/dev/ttyS1",O_RDWR|O_NOCTTY);
perror("open
/dev/ttyS1");
}
if(fd
==
-1)
/*打開失敗*/
return
-1;
else
return
0;
}
/********************************************************************/
int
main(int
argc,
char
*argv[
]
)
{
char
sbuf[]={"Hello,this
is
a
Serial_Port
test!/n"};/*待發(fā)送的內(nèi)容,以/n為結(jié)束標(biāo)志*/
int
sfd,retv,i;
struct
termios
option;
int
length=sizeof(sbuf);/*發(fā)送緩沖區(qū)數(shù)據(jù)寬度*/
/*******************************************************************/
open_serial(0);
/*打開串口1*/
/*******************************************************************/
printf("ready
for
sending
data.../n");
/*準(zhǔn)備開始發(fā)送數(shù)據(jù)*/
tcgetattr(fd,&option);
cfmakeraw(&option);
/*****************************************************************/
cfsetispeed(&option,B9600);
/*波特率設(shè)置為9600bps*/
cfsetospeed(&option,B9600);
/*******************************************************************/
tcsetattr(fd,TCSANOW,&option);
retv=write(fd,sbuf,length);
/*接收數(shù)據(jù)*/
if(retv==-1)
{
perror("write");
}
printf("the
number
of
char
sent
is
%d/n",retv);
flag_close
=close(fd);
if(flag_close==-1)
/*判斷是否成功關(guān)閉文件*/
printf("Close
the
Device
failur!/n");
return
0;
}
/****************************結(jié)束***********************************/
分別將上面的倆個(gè)程序編譯之后就可以運(yùn)行了,如果是在兩個(gè)不同的平臺上運(yùn)行,比如,在開發(fā)板上運(yùn)行數(shù)據(jù)發(fā)送程序write(write.c編譯后得到),在宿主機(jī)上運(yùn)行結(jié)收數(shù)據(jù)程序read(read.c編譯得到),采用串口線將二者正確連接之后,就可以運(yùn)行來看實(shí)際的效果了:
首先在宿主機(jī)端運(yùn)行數(shù)據(jù)接收程序receive:
[zhang@localhost]#./receive
[zhang@localhost]#open/dev/ttyS0:Success
readyforreceivingdata...
Thedatarece
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《新能源產(chǎn)業(yè)動態(tài)跟蹤及趨勢洞察月報(bào)(2023年12月)》范文
- 《基于古今醫(yī)案數(shù)據(jù)分析的咳嗽病證治規(guī)律研究》
- 《數(shù)控裝置硬件平臺功能安全研究與實(shí)現(xiàn)》
- 《基于皮秒激光的旋切制孔工藝及機(jī)理研究》
- 2024-2030年西安餐飲業(yè)市場經(jīng)營管理分析及發(fā)展規(guī)劃研究報(bào)告
- 2024年二手房買賣合同示范性文件
- 2024-2030年版中國霧霾治理行業(yè)發(fā)展形勢規(guī)劃研究報(bào)告
- 2024-2030年版中國姬松茸行業(yè)競爭格局及發(fā)展?jié)摿Ψ治鰣?bào)告
- 2024-2030年版中國衛(wèi)浴五金行業(yè)市場供需狀況及發(fā)展策略分析報(bào)告
- 2024-2030年新版中國金薄紙項(xiàng)目可行性研究報(bào)告
- 淮陰工學(xué)院《產(chǎn)品形態(tài)設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年長沙市事業(yè)單位招聘計(jì)算機(jī)崗位專業(yè)知識試題
- 咨詢咨詢合同三篇
- 2024年中國心力衰竭診斷和治療指南2024版
- 師范大學(xué)學(xué)術(shù)規(guī)范測試
- 福建師范大學(xué)《數(shù)字?jǐn)z像》2023-2024學(xué)年第一學(xué)期期末試卷
- 期末模擬練習(xí)(試題)-2024-2025學(xué)年蘇教版二年級上冊數(shù)學(xué)
- 2023阿里云ACA大數(shù)據(jù)復(fù)習(xí)題題庫及答案
- 基于PLC的物料分揀系統(tǒng)設(shè)計(jì)
- 國開(內(nèi)蒙古)2024年《創(chuàng)新創(chuàng)業(yè)教育基礎(chǔ)》形考任務(wù)1-3終考任務(wù)答案
- 文旅深度融合績效評估與反饋機(jī)制
評論
0/150
提交評論