版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一個(gè)c語(yǔ)言的串口通信程序范例標(biāo)簽: c語(yǔ)言串口通信通信程序it分類: 技術(shù)筆記 最近接觸一個(gè)項(xiàng)目,用HL-C1C激光位移傳感器+易控組態(tài)軟件完成生產(chǎn)線高度跳變檢測(cè),好久沒(méi)有接觸c c#,一些資料,找來(lái)做個(gè)記錄,也許大家用的著#include #include #include #include #define COM232 0x2f8#define COMINT 0x0b#define MaxBufLen 500#define Port8259 0x20#define EofInt 0x20static int comportaddr;static char intvectnum;static
2、 unsigned char maskb;static unsigned char BufferMaxBufLen;static int CharsInBuf,CircIn,CircOut;static void (interrupt far *OldAsyncInt)();static void interrupt far AsyncInt(void);void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char
3、Parity)unsigned char High,Low;int f;comportaddr=ComPortAddr;intvectnum=IntVectNum;CharsInBuf=0;CircIn=0;CircOut=0;f=(Baud/100);f=1152/f; High=f/256;Low=f-High*256;outp(ComPortAddr+3,0x80);outp(ComPortAddr,Low);outp(ComPortAddr+1,High);Data=(Data-5)|(Stop-1)*4);if(Parity=2) Data=Data|0x18;else if(Par
4、ity=1) Data=Data|0x8;outp(ComPortAddr+3,Data);outp(ComPortAddr+4,0x0a);outp(ComPortAddr+1,0x01);disable();OldAsyncInt=getvect( IntVectNum );setvect( IntVectNum, AsyncInt );enable();maskb=inp(Port8259+1);if(IntVectNum=0x0c)outp(Port8259+1,maskb&0xef);else outp(Port8259+1,maskb&0xf7);static void inter
5、rupt far AsyncInt(void)disable();if(CharsInBufMaxBufLen) BufferCircIn=inp(comportaddr);if(CircIn0) (*Char)=BufferCircOut; if(CircOutMaxBufLen-1)CircOut+; else CircOut=0; CharsInBuf-; Flag=0; return Flag;int SendChar(unsigned char Char)if(inp(comportaddr+5)&0x20)=0) return -1;outp(comportaddr,Char);r
6、eturn 0;main()int i,c;unsigned char InChar;Init_COM(COM232,COMINT,1200,8,1,0);while(1) if(kbhit() if(InChar=getch()=27)break; else while(SendChar(InChar); if(GetCharInBuf(&InChar)=0) printf(%c,InChar);Restore();接收程序:#include #include #include #include #include #include #define RXD 0 /接收#define TXD 0
7、 /發(fā)送#define LSB 0 /波特率調(diào)節(jié)低8位#define MSB 1 /波特率調(diào)節(jié)高8位#define IER 1 / 中斷起用寄存器#define IIR 2 /中斷標(biāo)識(shí)寄存器#define LCR 3 /線路控制寄存器#define MCR 4 /調(diào)制解調(diào)器控制寄存器#define LSR 5 /線路狀態(tài)寄存器#define MSR 6 /調(diào)制解調(diào)器狀態(tài)寄存器#define IERV 1#define OUT2 0x08#define ERTS 2#define EDTR 1#define EMPTY 0X20#define READY 0X30#define ICREG 0X
8、20#define IMASKREG 0X21#define EOI 0X20#define WAITCOUNT 5000#define BUFFLEN 2048 /用于存儲(chǔ)字符的數(shù)組的界#define ALTE 0X12#define ALTQ 0X10#define SER_BAUD_1200 96 #define SER_BAUD_2400 48#define SER_BAUD_9600 0x0C#define SER_BAUD_19200 6#define SER_STOP_1 0 /*/ 1 stop bit per character*/#define SER_STOP_2 4 /
9、*/ 2 stop bits per character*/#define SER_BITS_5 0 /*/ send 5 bit characters*/#define SER_BITS_6 1 /*/ send 6 bit characters*/#define SER_BITS_7 2 /*/ send 7 bit characters*/#define SER_BITS_8 3 /*/ send 8 bit characters*/#define SER_PARITY_NONE 0 /*/ no parity*/#define SER_PARITY_ODD 8 /*/ odd pari
10、ty*/#define SER_PARITY_EVEN 24 /*/ even parity*/int port;int ComNum;unsigned portaddr;unsigned portf;unsigned int baudtable=0x180,0xc0,0x60,0x30,0x18,0x0c,0x06;unsigned char paritytable=0x08,0x18,0x00,0x28,0x38;unsigned char bufferBUFFLEN;/recv bufint buffin=0;int buffout=0;int incount=0;int outcoun
11、t=0;void interrupt(*vect_com)(.);void putb(unsigned char ch)/write a char to the recvbuf 將中斷得到的數(shù)據(jù)寫到緩沖區(qū)int temp;temp=buffin;if(+buffin=BUFFLEN) buffin=0;if(buffin!=buffout) bufferbuffin=ch; / printf(bufferin%d=%c,bufferbuffin); / getch(); else buffin=temp;unsigned char getb()/read a char from the rec
12、vbufif(buffout!=buffin) if(+buffout=BUFFLEN) buffout=0; /printf(bufferout%d=%c,buffout,bufferbuffout); return(bufferbuffout); else return(0xff);/*unsigned char sender( unsigned char ch)outportb(portaddr2+TXD,ch);printf(nsender outportdata=%cn,ch);outcount+;return(1);*/void interrupt receiver(.)unsig
13、ned char ch;ch=inportb(portaddr+RXD);putb(ch);incount+; /記錄接收了多少個(gè)數(shù)據(jù)。outportb(ICREG,EOI);void SerInit(int baud,int configuration)disable();outportb(portaddr+LCR,0x80);outportb(portaddr+LSB,baud);outportb(portaddr+MSB,0x00);outportb(portaddr+LCR,configuration);enable();void SerOpen(void)vect_com=getve
14、ct(portf+8);disable();inportb(portaddr+RXD);inportb(portaddr+MSR);inportb(portaddr+LSR);inportb(portaddr+IIR);outportb(portaddr+IER,IERV);outportb(portaddr+MCR,OUT2|ERTS|EDTR);outportb(IMASKREG,inportb(IMASKREG)&(1portf);setvect(portf+8,receiver);enable();void SerClose(void)disable();outportb(portad
15、dr+IER,0);outportb(portaddr+MCR,0);outportb(IMASKREG,inportb(IMASKREG)|(1ComNum;printf(the current com set is:9600,even, data bits 8, stop 1,);Int();printf(nnOVERn);exit(0);發(fā)送文件程序#include #include #include #include #include #include #ifdef _cplusplus #define _CPPARGS .#else #define _CPPARGS#endif#de
16、fine SER_RBF 0 #define SER_THR 0 #define SER_IER 1 #define SER_IIR 2 #define SER_LCR 3 #define SER_MCR 4 #define SER_LSR 5 #define SER_MSR 6 #define SER_DLL 0 #define SER_DLH 1 #define SER_BAUD_1200 96 #define SER_BAUD_2400 48#define SER_BAUD_9600 12#define SER_BAUD_19200 6#define SER_GP02 8 #define
17、 COM_1 0x3F8 #define COM_2 0x2F8 /*/ base port address of port 1*/#define COM_3 0x3E8#define COM_4 0x2E8#define SER_STOP_1 0 /*/ 1 stop bit per character*/#define SER_STOP_2 4 /*/ 2 stop bits per character*/#define SER_BITS_5 0 /*/ send 5 bit characters*/#define SER_BITS_6 1 /*/ send 6 bit character
18、s*/#define SER_BITS_7 2 /*/ send 7 bit characters*/#define SER_BITS_8 3 /*/ send 8 bit characters*/#define SER_PARITY_NONE 0 /*/ no parity*/#define SER_PARITY_ODD 8 /*/ odd parity*/#define SER_PARITY_EVEN 24 /*/ even parity*/#define SER_DIV_LATCH_ON 128 /*/ used to turn reg 0,1 into divisor latch*/#
19、define PIC_IMR 0x21 /*/ pics interrupt mask reg.*/#define PIC_ICR 0x20 /*/ pics interupt control reg.*/#define INT_SER_PORT_0 0x0C /*/ port 0 interrupt com 1 & 3*/#define INT_SER_PORT_1 0x0B /*/ port 0 interrupt com 2 & 4*/#define SERIAL_BUFF_SIZE 128 /*/ current size of circulating receive buffer*/
20、void interrupt far (*Old_Isr)(_CPPARGS); /*/ holds old com port interrupt handler*/char ser_bufferSERIAL_BUFF_SIZE; /*/ the receive buffer*/int ser_end = -1,ser_start=-1; /*/ indexes into receive buffer*/int ser_ch, char_ready=0; /*/ current character and ready flag*/int old_int_mask; /*/ the old in
21、terrupt mask on the PIC*/int open_port; /*/ the currently open port*/int serial_lock = 0; /*/ serial ISR semaphore so the buffer*/ /*/ isnt altered will it is being written*/ /*/ to by the ISR*/*-寫串口-*/ void interrupt far Serial_Isr(_CPPARGS)serial_lock = 1;ser_ch = inp(open_port + SER_RBF);if (+ser
22、_end SERIAL_BUFF_SIZE-1) ser_end = 0;ser_bufferser_end = ser_ch;+char_ready;outp(PIC_ICR,0x20);serial_lock = 0; int Ready_Serial()return(char_ready); /*-讀串口-*/int Serial_Read()int ch;while(serial_lock)if (ser_end != ser_start) if (+ser_start SERIAL_BUFF_SIZE-1) ser_start = 0; ch = ser_bufferser_star
23、t; printf(%x,ch); if (char_ready 0) -char_ready; return(ch); else return(0); /*-寫串口-*/Serial_Write(char ch)while(!(inp(open_port + SER_LSR) & 0x20)asm clioutp(open_port + SER_THR, ch);asm sti/*-初始化串口-*/Open_Serial(int port_base, int baud, int configuration)open_port = port_base;disable();outp(port_b
24、ase + SER_LCR, SER_DIV_LATCH_ON);outp(port_base + SER_DLL, baud);outp(port_base + SER_DLH, 0);outp(port_base + SER_LCR, configuration);outp(port_base + SER_MCR, SER_GP02);outp(port_base + SER_IER, 1);if (port_base = COM_1 | port_base=COM_3) Old_Isr = _dos_getvect(INT_SER_PORT_0); _dos_setvect(INT_SE
25、R_PORT_0, Serial_Isr); printf(nOpening Communications Channel Com Port #1/3.n); else Old_Isr = _dos_getvect(INT_SER_PORT_1); _dos_setvect(INT_SER_PORT_1, Serial_Isr); printf(nOpening Communications Channel Com Port #2/4.n); old_int_mask = inp(PIC_IMR);outp(PIC_IMR, (port_base=COM_1) ? (old_int_mask
26、& 0xEF) : (old_int_mask & 0xF7 );enable();/*-關(guān)閉串口-*/Close_Serial(int port_base)outp(port_base + SER_MCR, 0);outp(port_base + SER_IER, 0);outp(PIC_IMR, old_int_mask );if (port_base = COM_1) _dos_setvect(INT_SER_PORT_0, Old_Isr); printf(nClosing Communications Channel Com Port #1.n); else _dos_setvect
27、(INT_SER_PORT_1, Old_Isr); printf(nClosing Communications Channel Com Port #2.n); /*-發(fā)送應(yīng)用-*/void main(int argc,char *argv)char ch,press;int done=0;FILE *fp;argc=2;/argv1=c:comfile.c;if(argc2) printf(nUsage:display filename.wav!);/ exit(1);if(fp=fopen(argv1,r+b)=NULL) printf(cannot open the filen);/ exit(0);fseek(fp, 0, SEEK_SET);Open_Serial(COM_1,SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS_8 | SER_STOP_1);printf(com:1;bps:9600;parity:even;bits:8;stop bit:1);printf(press any key to begin sending);getch();/Serial_Write(); /該語(yǔ)句可用于發(fā)送單個(gè)字符while(!done&ch != EOF) /發(fā)送
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)培訓(xùn)師資引進(jìn)合同
- 二零二五年度土地開(kāi)發(fā)權(quán)轉(zhuǎn)讓居間代理合同模板
- 二零二五年度出差安全防護(hù)設(shè)備及服務(wù)租賃合同4篇
- 2025業(yè)績(jī)目標(biāo)達(dá)成股權(quán)激勵(lì)與員工股權(quán)激勵(lì)績(jī)效合同3篇
- 二零二五年度企業(yè)培訓(xùn)項(xiàng)目監(jiān)督合同
- 二零二五年度天然氣交易平臺(tái)服務(wù)合同
- 二零二五年度兩居房車租賃與民宿合作合同樣本2篇
- 2025年度水路聯(lián)合運(yùn)輸貨運(yùn)代理服務(wù)合同范本
- 二零二五版文化產(chǎn)業(yè)發(fā)展擔(dān)保合同示范文本4篇
- 2025年度個(gè)人房產(chǎn)抵押貸款擔(dān)保合同違約責(zé)任4篇
- 2025年度杭州市固廢處理與資源化利用合同3篇
- 部編版二年級(jí)下冊(cè)《道德與法治》教案及反思(更新)
- 充電樁項(xiàng)目運(yùn)營(yíng)方案
- 退休人員出國(guó)探親申請(qǐng)書(shū)
- 傷殘撫恤管理辦法實(shí)施細(xì)則
- 高中物理競(jìng)賽真題分類匯編 4 光學(xué) (學(xué)生版+解析版50題)
- 西方經(jīng)濟(jì)學(xué)-高鴻業(yè)-筆記
- 幼兒園美術(shù)教育研究策略國(guó)內(nèi)外
- 物業(yè)公司介紹
- 2024屆河南省五市高三第一次聯(lián)考英語(yǔ)試題及答案
- 【永輝超市公司員工招聘問(wèn)題及優(yōu)化(12000字論文)】
評(píng)論
0/150
提交評(píng)論