c串口過濾
A. c語言串口通訊過程
分接收端和發送端。
接收端:
1·打開com1埠
fd=fopen("/dev/ttys0",方式);
2·取得當前串口值,保存到結構體變數oldtio
tcgetattr(fd,&oldtio);
3·串口結構體變數newtio清0.
bzero(&newtio,sizeof(newtio))
4·設置串口參數
主要設置比特率、是否忽略奇偶校驗錯誤,啟用正規模式等等。
接收端
1·打開com埠
2·取得當前串口值
3·串口結構體變數清0
4·設置串口參數。
B. 怎麼用C語言中斷方式實現串口的讀寫
#include <stdio.h>
#include <dos.h>
#include <time.h>
#define LSB 0
#define MSB 1
#define RXR 0
#define TXR 0
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6
#define Com1_base 0x3f8
#define uchar unsigned char
volatile uchar inputData;
volatile uchar onInput = 0x00;
volatile uchar onOutput = 0x00;
volatile uchar inputdata[256]; /*設設置接收緩沖區大小*/
volatile unsigned int count; /*中斷接收的數據數目*/
int datacount;/*當前已發送數據條數*/
void interrupt (*OldVect)(); /*函數是用來獲取中斷處理程序的入口地址的*/
void interrupt SerialISR();
void InitCom()
{
uchar inttemp;
/*設置波特率什麼的*/
outportb(Com1_base+LCR,0x80); /*使LCR的高位為1,以便讀取其它寄存器*/
outportb(Com1_base+LSB,0x0c); /*除數鎖存器(低8位)DLL*/
outportb(Com1_base+MSB,0x00); /*除數鎖存器(高8位)DLH 產生2400波特率*/
outportb(Com1_base+LCR,0x03); /*8位數據,1位停止位,無校驗*/
outportb(Com1_base+IER,0x01); /*接收採用中斷方式*/
/*設置中斷向量*/
OldVect = getvect(0x0c); /*函數是用來獲取中斷處理程序的入口地址的*/
disable();
inttemp = inportb(0x21)&0xef;
outportb(0x21,inttemp);
setvect(0x0c,SerialISR); /*設置SerialISR的中斷入口地址為0X0C*/
enable();
}
void CloseCom()
{
disable();
outportb(Com1_base+IER,0x00); *禁止中斷*/
outportb(Com1_base,0x00);
outportb(0x21,inportb(0x21)|~(0xef));
setvect(0x0c,OldVect);
}
void interrupt SerialISR()
{
/*串口中斷服務代碼*/
inputData = inportb(Com1_base+RXR);
onInput = 0x01;
inputdata[count]=inputData;
count++;
/*服務代碼結束*/
outportb(0x20,0x20); /*中斷結束的代碼*/
}
void SendChar(uchar key)
{
while( ((inportb(Com1_base + LSR)) & 0x40) == 0);
outportb(Com1_base + TXR,key);
}
/*...........延時函數......................*/
void delay(unsigned int n)
{
unsigned int i,k;
for(k=0;k<n;k++)
{
for(i=1;i<1142;i++)
;
}
}
/*........CDMA命令發送函數.................*/
void CDMA_CommandSend(char *p,unsigned int n)
{
int i,k,m,l;
int flag=0;
int selse_flag=0; int selse_flag_1=0;
int selse_flag1=0;int selse_flag1_1=0;
time_t start,end;
double dif=0;
char a;
uchar bExit_flag = 0x00;
count=0;
while(!bExit_flag)
{
count=0;
for(i=0;i<n;i++)
{SendChar(*p);delay(9000);p++;}
/*..........等待2S..................*/
time (&start);
dif=0;
while(dif<2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
if(count>14)
{
time (&start);
dif=0;
while(dif<3)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
}
/*..........判斷發送命令是否成功..................*/
for(m=0;m<count;m++)
{
if(count>10)
{
for(l=0;l<count;l++)
{
if(inputdata[l-1]=='N'&&inputdata[l-2]=='E'&&inputdata[l-3]=='P'&&inputdata[l-4]=='O'&&inputdata[l-5]=='P'&&inputdata[l-6]=='P'&&inputdata[l-7]=='P'&&inputdata[l-8]=='V') { selse_flag_1=1;}
if(inputdata[l-1]=='N'&&inputdata[l-2]=='E'&&inputdata[l-3]=='P'&&inputdata[l-4]=='O'&&inputdata[l-5]=='P'&&inputdata[l-6]=='C'&&inputdata[l-7]=='T'&&inputdata[l-8]=='V') { selse_flag1_1=1;}
}
if(selse_flag_1==1){if(inputdata[m-1]=='3'&&inputdata[m-2]=='3'&&inputdata[m-3]==':'&&inputdata[m-4]=='T') selse_flag=1;}
if(selse_flag1_1==1){if(inputdata[m-1]=='0'&&inputdata[m-2]==','&&inputdata[m-3]=='1'&&inputdata[m-4]==':'&&inputdata[m-5]=='N') selse_flag1=1;}
if(selse_flag_1==1||selse_flag1_1==1)
{
if(selse_flag==1) {if(inputdata[m-1]=='0'&&inputdata[m-2]==':'&&inputdata[m-3]=='N'&&inputdata[m-4]=='E') flag=1;}
if(selse_flag1==1) {if(inputdata[m-1]=='0'&&inputdata[m-2]==','&&inputdata[m-3]=='1'&&inputdata[m-4]==':'&&inputdata[m-5]=='S') flag=1;}
}
else {if(inputdata[m-1]=='O'&&inputdata[m]=='K') {flag=1; }}
}
else {if(inputdata[m-1]=='O'&&inputdata[m]=='K') flag=1; }
}
if(flag==1){bExit_flag = 0x01;}
else {p=p-n; }
for(i=0;i<count;i++) printf("%c",inputdata[i]);
/*........按空格停止測試.............................*/
if(kbhit()){a=getch(); if(a==' '){CloseCom(); exit(1);}}
}
}
/*........數據測試發送任務.....................*/
void Data_Send(char *pcomd,int n,char *pdata,int m)
{
int i,k,l;time_t start,end;
double dif=0;
count=0;
for(i=0;i<n;i++)
{
SendChar(*pcomd);delay(9000);pcomd++;
}
time (&start);
dif=0;
while(dif<0.2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
for(l=0;l<m;l++)
{
SendChar(*pdata);pdata++;
}
printf("The data num:%d",datacount);
datacount++;
}
void main()
{int i;char a;
/*........模塊測試命令..................................*/
uchar CDMA_COMMAND_1[]={"at\r"};
uchar CDMA_COMMAND_2[]={"atz\r"};
uchar CDMA_COMMAND_3[]={"ate1v1\r"};
uchar CDMA_COMMAND_4[]={"AT+CRM=1;+CPS=33;+CMUX=1;+CTA=0\r"};
uchar CDMA_COMMAND_5[]={"AT+VPPPOPEN\r"};
uchar CDMA_COMMAND_6[]={"AT+VTCPOPEN=1,\"60.63.42.129\",1234\r"};
uchar CDMA_COMMAND_7[]={"AT+VTCPSEND=1,20\r"};
uchar CDMA_DATA[]={"ABCDEFGHIJKLMNOPQRST"};
uchar CDMA_COMMAND_9[]={"AT+VPPPCLOSE\r"};
uchar CDMA_COMMAND_8[]={"AT+VTCPCLOSE=1\r"};
uchar bExit_flag1 = 0x00;
time_t start,end;
double dif=0;
InitCom();/*初始化埠1*/
inputData = inportb(Com1_base+RXR);
while(!bExit_flag1)
{
/*.................................................................*/
if(kbhit()) /*按任意鍵開始測試CDMA*/
{
/*.............................................................. ...*/
/*.........發送TCP斷開命令.....................................*/
CDMA_CommandSend(CDMA_COMMAND_8,strlen(CDMA_COMMAND_8));
/*.........發送PPP斷開命令......................................*/
CDMA_CommandSend(CDMA_COMMAND_9,strlen(CDMA_COMMAND_9));
/*.........發送AT命令..........................................*/
CDMA_CommandSend(CDMA_COMMAND_1,strlen(CDMA_COMMAND_1));
/*.........發送ATZ命令.........................................*/
CDMA_CommandSend(CDMA_COMMAND_2,strlen(CDMA_COMMAND_2));
/*.........發送ATE1V1命令......................................*/
CDMA_CommandSend(CDMA_COMMAND_3,strlen(CDMA_COMMAND_3));
/*.........發送AT初始化命令....................................*/
CDMA_CommandSend(CDMA_COMMAND_4,strlen(CDMA_COMMAND_4));
/*.........發送PPP拔號命令.....................................*/
CDMA_CommandSend(CDMA_COMMAND_5,strlen(CDMA_COMMAND_5));
/*.........發送網路連接命令....................................*/
CDMA_CommandSend(CDMA_COMMAND_6,strlen(CDMA_COMMAND_6));
/*.........發送數據............................................*/
datacount=0;
while(1)
{
Data_Send(CDMA_COMMAND_7,strlen(CDMA_COMMAND_7),CDMA_DATA,strlen(CDMA_DATA));
time (&start);
dif=0;
while(dif<0.2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
if(kbhit()){a=getch(); if(a==' '){bExit_flag1 = 0x01; break;}}
}
/*.........發送TCP斷開命令.....................................*/
for(i=0;i<3;i++)
CDMA_CommandSend(CDMA_COMMAND_8,strlen(CDMA_COMMAND_8));
/*.........發送PPP斷開命令......................................*/
for(i=0;i<3;i++)
CDMA_CommandSend(CDMA_COMMAND_9,strlen(CDMA_COMMAND_9));
bExit_flag1 = 0x01;
}
/*.................................................................*/
}
CloseCom(); /*關閉埠1*/
printf("Bye~.\n");
}
C. 串口接收數據C語言如何判是\r 或\n
串口接收是一個位元組一個位元組接收的。
將接收的位元組存入緩存中,然後判斷存入的數據是否是\r\n就可以了
char recbuf[256] //接收緩存
int recvcount = 0; //接收計數
if (recdata != '\n')
{
recbuf[recvcount++] = recdata; //如果數據不為'\n'則存入緩存
}
else
{
//如果接收的是'\n',且上一個接收到得數據為'\r',則結束
if(recbuf[recvcount-1] == '\r')
{
recbuf[recvcount-1] = 0x00; //以0x00結尾
recvcount = 0; //計數歸零
……後續操作
}
else
{
//如果上一個數據不為'\r'則繼續接收
recbuf[recvcount++] = recdata;
}
}
D. C語言變成實現串口收發數據
#include <reg51.h>
#include <intrins.h>
unsigned char key_s, key_v, tmp;
char code str[] = "welcome!www.willar.com
";
void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
sbit K1 = P1^4;
main()
{
TMOD = 0x20; // 定時器1工作於8位自動重載模式, 用於產生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 設定串列口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 啟動定時器1
IE = 0x0; // 禁止任何中斷
while(1)
{
if(scan_key()) // 掃描按鍵
{
delayms(10); // 延時去抖動
if(scan_key()) // 再次掃描
{
key_v = key_s; // 保存鍵值
proc_key(); // 鍵處理
}
}
if(RI) // 是否有數據到來
{
RI = 0;
tmp = SBUF; // 暫存接收到的數據
P0 = tmp; // 數據傳送到P0口
send_char(tmp); // 回傳接收到的數據
}
}
}
bit scan_key()
// 掃描按鍵
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
// 鍵處理
{
if((key_v & 0x01) == 0)
{ // K1按下
send_str(); // 傳送字串"welcome!...
}
}
void send_char(unsigned char txd)
// 傳送一個字元
{
SBUF = txd;
while(!TI); // 等特數據傳送
TI = 0; // 清除數據傳送標志
}
void send_str()
// 傳送字串
{
unsigned char i = 0;
while(str[i] != '