版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
/一個(gè)c語(yǔ)言的串口通信程序范例標(biāo)簽:c語(yǔ)言串口通信通信程序it分類(lèi):技術(shù)筆記最近接觸一個(gè)項(xiàng)目,用HL-C1C激光位移傳感器+易控組態(tài)軟件完成生產(chǎn)線高度跳變檢測(cè),好久沒(méi)有接觸cc#,一些資料,找來(lái)做個(gè)記錄,也許大家用的著#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<string.h>#defineCOM232
0x2f8
#defineCOMINT
0x0b#defineMaxBufLen
500
#definePort8259
0x20
#defineEofInt
0x20staticint
comportaddr;
staticcharintvectnum;
staticunsignedcharmaskb;
staticunsignedcharBuffer[MaxBufLen];
staticint
CharsInBuf,CircIn,CircOut;staticvoid(interruptfar*OldAsyncInt)();
staticvoidinterruptfarAsyncInt(void);voidInit_COM(intComPortAddr,unsignedcharIntVectNum,intBaud,
unsignedcharData,unsignedcharStop,unsignedcharParity)
{
unsignedcharHigh,Low;
intf;
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;
elseif(Parity==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);
elseoutp(Port8259+1,maskb&0xf7);
}staticvoidinterruptfarAsyncInt(void)
{
disable();
if(CharsInBuf<MaxBufLen)
Buffer[CircIn]=inp(comportaddr);
if(CircIn<MaxBufLen-1)CircIn++;
elseCircIn=0;
if(CircIn==CircOut)CircOut++;
elseCharsInBuf++;
enable();
outp(Port8259,EofInt);
}voidRestore(void)
{
setvect(intvectnum,OldAsyncInt);
outp(Port8259+1,maskb);
}
intGetCharInBuf(unsignedchar*Char)
{
intFlag;
Flag=-1;
if(CharsInBuf>0)
{
(*Char)=Buffer[CircOut];
if(CircOut<MaxBufLen-1)CircOut++;
elseCircOut=0;
CharsInBuf--;
Flag=0;
}
returnFlag;
}intSendChar(unsignedcharChar)
{
if((inp(comportaddr+5)&0x20)==0)return-1;
outp(comportaddr,Char);
return0;
}main()
{
inti,c;
unsignedcharInChar;
Init_COM(COM232,COMINT,1200,8,1,0);
while(1)
{
if(kbhit())
{if((InChar=getch())==27)break;
elsewhile(SendChar(InChar));
}
if(GetCharInBuf(&InChar)==0)
printf("%c",InChar);
}
Restore();
}
接收程序:
#include<dos.h>
#include<fstream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#defineRXD0//接收
#defineTXD0//發(fā)送
#defineLSB0//波特率調(diào)節(jié)低8位
#defineMSB1//波特率調(diào)節(jié)高8位
#defineIER1//中斷起用寄存器
#defineIIR2//中斷標(biāo)識(shí)寄存器
#defineLCR3//線路控制寄存器
#defineMCR4//調(diào)制解調(diào)器控制寄存器
#defineLSR5//線路狀態(tài)寄存器
#defineMSR6//調(diào)制解調(diào)器狀態(tài)寄存器
#defineIERV1
#defineOUT20x08
#defineERTS2
#defineEDTR1
#defineEMPTY0X20
#defineREADY0X30
#defineICREG0X20
#defineIMASKREG0X21
#defineEOI0X20
#defineWAITCOUNT5000
#defineBUFFLEN2048//用于存儲(chǔ)字符的數(shù)組的界
#defineALTE0X12
#defineALTQ0X10
#defineSER_BAUD_120096
#defineSER_BAUD_240048
#defineSER_BAUD_96000x0C
#defineSER_BAUD_192006
#defineSER_STOP_10/*/1stopbitpercharacter*/
#defineSER_STOP_24/*/2stopbitspercharacter*/
#defineSER_BITS_50/*/send5bitcharacters*/
#defineSER_BITS_61/*/send6bitcharacters*/
#defineSER_BITS_72/*/send7bitcharacters*/
#defineSER_BITS_83/*/send8bitcharacters*/
#defineSER_PARITY_NONE0/*/noparity*/
#defineSER_PARITY_ODD8/*/oddparity*/
#defineSER_PARITY_EVEN24/*/evenparity*/
intport;
intComNum;
unsignedportaddr;
unsignedportf;
unsignedintbaudtable[]={0x180,0xc0,0x60,0x30,0x18,0x0c,0x06};
unsignedcharparitytable[]={0x08,0x18,0x00,0x28,0x38};
unsignedcharbuffer[BUFFLEN];//recvbuf
intbuffin=0;
intbuffout=0;
intincount=0;
intoutcount=0;
voidinterrupt(*vect_com)(...);
voidputb(unsignedcharch)//writeachartotherecvbuf將中斷得到的數(shù)據(jù)寫(xiě)到緩沖區(qū)
{
inttemp;
temp=buffin;
if(++buffin==BUFFLEN)
buffin=0;
if(buffin!=buffout)
{buffer[buffin]=ch;
//printf("bufferin[%d]=%c",buffer[buffin]);
//getch();
}
else
buffin=temp;
};
unsignedchargetb()//readacharfromtherecvbuf
{
if(buffout!=buffin)
{
if(++buffout==BUFFLEN)
buffout=0;
//printf("bufferout[%d]=%c",buffout,buffer[buffout]);
return(buffer[buffout]);
}
else
return(0xff);
};
/*unsignedcharsender(unsignedcharch)
{
outportb(portaddr2+TXD,ch);
printf("\nsenderoutportdata=%c\n",ch);
outcount++;
return(1);
};
*/
voidinterruptreceiver(...)
{
unsignedcharch;
ch=inportb(portaddr+RXD);
putb(ch);
incount++;//記錄接收了多少個(gè)數(shù)據(jù)。
outportb(ICREG,EOI);
};
voidSerInit(intbaud,intconfiguration)
{
disable();
outportb(portaddr+LCR,0x80);
outportb(portaddr+LSB,baud);
outportb(portaddr+MSB,0x00);
outportb(portaddr+LCR,configuration);
enable();
};
voidSerOpen(void)
{
vect_com=getvect(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)&(~(1<<portf)));
setvect(portf+8,receiver);
enable();
};
voidSerClose(void)
{
disable();
outportb(portaddr+IER,0);
outportb(portaddr+MCR,0);
outportb(IMASKREG,inportb(IMASKREG)|(1<<portf));
enable();
setvect(portf+8,vect_com);
};
voidGetportaddr(intport)
{
switch(port)
{
case0:portaddr=0x3F8;break;
case1:portaddr=0x2F8;break;
case2:portaddr=0x3E8;break;
case3:portaddr=0x2E8;break;
}
portf=(port==0)?4:3;
};
voidInt()
{
unsignedcharkey,key2;
port=ComNum-1;
if(peek(0x40,port*2)==0)
{
printf("havenospecialcom.\n");
exit(1);
}
else
{
printf("Theusedportis:COM%d\n",ComNum);
};
Getportaddr(port);//得到串口地址
SerInit(SER_BAUD_9600,SER_PARITY_EVEN|SER_BITS_8|SER_STOP_1);//初始化串口,設(shè)置波特率等
SerOpen();
do
{
if(kbhit())
{
key2=getch();
if(key2==27){break;}
};
key=getb();
if(key!=0xff)
{
printf("%x\t",key);
FILE*fp;
fp=fopen("C:\\Receivedata.dat","ab");//可選擇接收數(shù)據(jù)的存放文件路徑和文件名
if(fp==NULL)printf("error!");
//fputc(key,fp);
fwrite(&key,sizeof(unsignedchar),1,fp);
fclose(fp);
}
}while(key2!=27);
SerClose();
//printf("%dcharhasbeenreceived\n",incount);
//printf("%dcharhasbeensended\n",outcount);
//printf("\nsum=%d\n",sum);
}
voidmain()//com1receive
{
printf("PleaseinputthereceiveCOMnum:(1~4)\n");
cin>>ComNum;
printf("thecurrentcomsetis:9600,even,databits8,stop1,");
Int();
printf("\n\nOVER\n");
exit(0);
};
---------------
發(fā)送文件程序
#include<dos.h>
#include<bios.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
#ifdef__cplusplus
#define__CPPARGS...
#else
#define__CPPARGS
#endif
#defineSER_RBF0
#defineSER_THR0
#defineSER_IER1
#defineSER_IIR2
#defineSER_LCR3
#defineSER_MCR4
#defineSER_LSR5
#defineSER_MSR6
#defineSER_DLL0
#defineSER_DLH1
#defineSER_BAUD_120096
#defineSER_BAUD_240048
#defineSER_BAUD_960012
#defineSER_BAUD_192006
#defineSER_GP028
#defineCOM_10x3F8
#defineCOM_20x2F8/*/baseportaddressofport1*/
#defineCOM_30x3E8
#defineCOM_40x2E8
#defineSER_STOP_10/*/1stopbitpercharacter*/
#defineSER_STOP_24/*/2stopbitspercharacter*/
#defineSER_BITS_50/*/send5bitcharacters*/
#defineSER_BITS_61/*/send6bitcharacters*/
#defineSER_BITS_72/*/send7bitcharacters*/
#defineSER_BITS_83/*/send8bitcharacters*/
#defineSER_PARITY_NONE0/*/noparity*/
#defineSER_PARITY_ODD8/*/oddparity*/
#defineSER_PARITY_EVEN24/*/evenparity*/
#defineSER_DIV_LATCH_ON128/*/usedtoturnreg0,1intodivisorlatch*/
#definePIC_IMR0x21/*/pic'sinterruptmaskreg.*/
#definePIC_ICR0x20/*/pic'sinteruptcontrolreg.*/
#defineINT_SER_PORT_00x0C/*/port0interruptcom1&3*/
#defineINT_SER_PORT_10x0B/*/port0interruptcom2&4*/
#defineSERIAL_BUFF_SIZE128/*/currentsizeofcirculatingreceivebuffer*/
voidinterruptfar(*Old_Isr)(__CPPARGS);/*/holdsoldcomportinterrupthandler*/
charser_buffer[SERIAL_BUFF_SIZE];/*/thereceivebuffer*/
intser_end=-1,ser_start=-1;/*/indexesintoreceivebuffer*/
intser_ch,char_ready=0;/*/currentcharacterandreadyflag*/
intold_int_mask;/*/theoldinterruptmaskonthePIC*/
intopen_port;/*/thecurrentlyopenport*/
intserial_lock=0;/*/serialISRsemaphoresothebuffer*/
/*/isn'talteredwillitisbeingwritten*/
/*/tobytheISR*/
/*寫(xiě)串口*/
voidinterruptfarSerial_Isr(__CPPARGS)
{
serial_lock=1;
ser_ch=inp(open_port+SER_RBF);
if(++ser_end>SERIAL_BUFF_SIZE-1)
ser_end=0;
ser_buffer[ser_end]=ser_ch;
++char_ready;
outp(PIC_ICR,0x20);
serial_lock=0;
}
intReady_Serial()
{
return(char_ready);
}
/*讀串口*/
intSerial_Read()
{
intch;
while(serial_lock){}
if(ser_end!=ser_start)
{
if(++ser_start>SERIAL_BUFF_SIZE-1)
ser_start=0;
ch=ser_buffer[ser_start];
printf("%x",ch);
if(char_ready>0)
--char_ready;
return(ch);
}
else
return(0);
}
/*寫(xiě)串口*/
Serial_Write(charch)
{
while(!(inp(open_port+SER_LSR)&0x20)){}
asmcli
outp(open_port+SER_THR,ch);
asmsti
}
/*初始化串口*/
Open_Serial(intport_base,intbaud,intconfiguration)
{
open_port=port_base;
disable();
outp(port_base+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_SER_PORT_0,Serial_Isr);
printf("\nOpeningCommunicationsChannelComPort#1/3...\n");
}
else
{
Old_Isr=_dos_getvect(INT_SER_PORT_1);
_dos_setvect(INT_SER_PORT_1,Serial_Isr);
printf("\nOpeningCommunicationsChannelComPort#2/4...\n");
}
old_int_mask=inp(PIC_IMR);
outp(PIC_IMR,(port_base==COM_1)?(old_int_mask&0xEF):(old_int_mask&0xF7));
enable();
}
/*關(guān)閉串口*/
Close_Serial(intport_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("\nClosingCommunicationsChannelComPort#1.\n");
}
else
{
_dos_setvect(INT_SER_PORT_1,Old_Isr);
printf("\nClosingCommunicationsChannelComPort#2.\n");
}
}
/*發(fā)送應(yīng)用*/
voidmain(intargc,char*argv[])
{
charch,press;
intdone=0;
FILE*fp;
argc=2;
//argv[1]="c:\\comfile.c";
if(argc<2)
{
printf("\nUsage:display!!!");
//exit(1);
}
if((fp=fopen(argv[1],"r+b"))==NULL)
{
printf("cannotopenthefile\n");
//exit(0);
}
fseek(fp,0,SEEK_SET);
Open_Seria
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025上半年江蘇省南京市江北新區(qū)社會(huì)事業(yè)局招聘23人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年度發(fā)電機(jī)組性能優(yōu)化與節(jié)能維修合同
- 2025年度房地產(chǎn)分銷(xiāo)項(xiàng)目風(fēng)險(xiǎn)評(píng)估合同2篇
- 2025年度房地產(chǎn)項(xiàng)目圖文策劃與制作合同3篇
- 2025年度賓館布草洗滌、消毒及客房用品定制服務(wù)合同2篇
- 2025年度海洋工程勞務(wù)分包協(xié)議2篇
- 2025年度廢棄衣物回收與環(huán)保處理合同
- 2025年度二零二五年度工業(yè)用地土地使用權(quán)互換協(xié)議書(shū)3篇
- 2025年度地下數(shù)據(jù)中心地下室租賃管理協(xié)議3篇
- 2025年度航空航天器研發(fā)制造協(xié)議合同2篇
- 2024年國(guó)家危險(xiǎn)化學(xué)品生產(chǎn)單位安全管理人員考試題庫(kù)(含答案)
- 水果電池課件教學(xué)課件
- 2024年重慶市中考數(shù)學(xué)真題卷(A)及答案解析
- 2024四川省專(zhuān)業(yè)技術(shù)人員繼續(xù)教育考試題及答案
- 蘇科版生物八年級(jí)下冊(cè) 8.24.2 傳染病的預(yù)防 -病毒 教案
- 插畫(huà)風(fēng)白族民族文化介紹
- 2024年安全員A證試題庫(kù)(附答案)
- 北師大版初中物理實(shí)驗(yàn)手冊(cè)
- 滬教版英語(yǔ)小學(xué)四年級(jí)上學(xué)期試卷與參考答案(2024-2025學(xué)年)
- 2022-2023學(xué)年廣東省廣州市天河區(qū)六年級(jí)(上)期末數(shù)學(xué)試卷(含答案)
- 村民小組長(zhǎng)述職報(bào)告
評(píng)論
0/150
提交評(píng)論