當前位置:首頁 » 編程語言 » c語言串口接收

c語言串口接收

發布時間: 2023-05-29 06:04:12

❶ 編寫單片機串口收發數據的完整程序(c語言編寫)

我用的新唐晶元,8051內核,跟51差不多,望採納
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit

SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
這個是發送
void UART_isr (void) interrupt 4 //串列中斷服務程序
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
Receive_Date[c] = SBUF_1;
if (Receive_Date[0] == First_Date)
{
c++;
}
else if(Receive_Date_Size > 0 && Receive_Date_Size < 4)
{
c++;
}
else if(Receive_Date[c] == Last_Date && Receive_Date_Size ==4)
{
c = 0;
Flag_Receive_One = 1;
}
else
{
c = 0;
}
}
}
接收

❷ 怎樣在WINDOWS下用C語言編寫串口接收數據程序

#include
#include
int
main(void)
{
FILE
*fp;
char
temp;
char
buf[100];
if((fp
=
fopen("com3","r"))
==
NULL)
puts("this
way
doesn't
work!\n");
else
puts("this
way
works!\n");
while(1)
{
temp
=
0;
fscanf(fp,"%c",&temp);
if(temp
!=
0)
putchar(temp);
else
Sleep(100);
}
fclose(fp);
return
0;
}
以前弄的,好久沒看了,不知到對不對。
還有下面這段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include
#include
HANDLE
hCom;
int
main(void)
{
hCom=CreateFile(TEXT("COM3"),//COM1口
GENERIC_READ|GENERIC_WRITE,
//允許讀和寫
0,
//獨占方式
NULL,
OPEN_EXISTING,
//打開而不是創建
0,
//同步方式
NULL);
if(hCom==(HANDLE)-1)
{
printf("打開COM失敗!\n");
return
FALSE;
}
else
{
printf("COM打開成功!\n");
}
SetupComm(hCom,1024,1024);
//輸入緩沖區和輸出緩沖區的大小都是1024
COMMTIMEOUTS
TimeOuts;
//設定讀超時
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//設定寫超時
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts);
//設置超時
DCB
dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;
//波特率為9600
dcb.ByteSize=8;
//每個位元組有8位
dcb.Parity=NOPARITY;
//無奇偶校驗位
dcb.StopBits=ONE5STOPBITS;
//兩個停止位
SetCommState(hCom,&dcb);
DWORD
wCount;//讀取的位元組數
BOOL
bReadStat;
while(1)
{
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
//清空緩沖區
char
str[9]={0};
printf("%s\n",str);
bReadStat=ReadFile(hCom,str,9,&wCount,NULL);
if(!bReadStat)
{
printf("讀串口失敗!");
return
FALSE;
}
else
{
str[8]='\0';
printf("%s\n",str);
}
Sleep(100);
}
}
以上兩段代碼是一年前弄的,我記得可以用,你試試。

❸ C語言串口收發數據

你波特率 沒設置正確吧 是否SMOD寄存器置1把波特率加倍了?

❹ C語言如何處理51串口接收數據

1、51單片機串列口是獨立的硬體,對其設置完之後,它就獨立工作了。如果REN=1,它會自動檢測RXD,當它收齊了一幀數據,就自動將數據放到(接收)SBUF,然後在RI置一。 CPU的中斷系統,如果已經開放了串口中慶氏敗斷,CPU就會自動轉到0023H去執行程序。

2、常式:

#include<AT89X51.H>//單片機51頭文件,存放著單片機的寄存器
unsignedchardat;//用於存儲單片機接收發送緩沖寄存器SBUF裡面的內容
sbitgewei=P2^2;核此//個位選通定義
sbitshiwei=P2^3;//十位選通定義
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};//0,1,2,3,4,5,6,7,8,9
voidDelay(unsignedinttc)//延時程序
{
while(tc!=0)
{unsignedinti;
for(i=0;譽顫i<100;i++);
tc--;}
}
voidLED()//LED顯示接收到的數據
{
shiwei=0;
P0=~table[dat/16];
Delay(8);
shiwei=1;
gewei=0;
P0=~table[dat%16];
Delay(5);
gewei=1;
}
voidInit_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;
TL1=0xFd;
TR1=1;
}
voidmain()//主程序功能:實現接收數據並把接收到的數據原樣發送回去///////
{
Init_Com();//串口初始化
//P1=0xf0;
while(1)
{
if(RI)//掃描判斷是否接收到數據,
{
dat=SBUF;//接收數據SBUF賦與dat
RI=0;//RI清零。
SBUF=dat;//在原樣把數據發送回去
}
LED();//顯示接收到的數據
}
}

❺ 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] != '')

{

SBUF = str[i];

while(!TI); // 等特數據傳送

TI = 0; // 清除數據傳送標志

i++; // 下一個字元

}

}

void delayms(unsigned char ms)

// 延時子程序

{

unsigned char i;

while(ms--)

{

for(i = 0; i < 120; i++);

}

}

拓展資料

C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。

盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。

二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標准局為C語言制定了一套完整的美國國家標准語法,稱為ANSI C,作為C語言最初的標准。目前2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標准,也是C語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。



❻ 單片機C語言 串口接收多個數

用一個數組來記錄每次收到的數據,全部收完後再來則空鬧看. 串口只有一個.是FIFO的.後面的孫罩數據來了虧族,前面的也就不復存焉

❼ 串口接收數據C語言如何判是 或

串口接收是一個位元組一個位元組接收的。
將接收的位元組存入緩存中,然後判陵基斷存入的數據是否是
就可以了
char
recbuf[256]
//接收緩存
int
recvcount
=
0;
//接收計數
if
(recdata
!=
'
')
{
recbuf[recvcount++]
=
recdata;
//如果數據不為'
'則存入緩存
}
else
{
//如果接收液汪升的是'鬧老
',且上一個接收到得數據為'
',則結束
if(recbuf[recvcount-1]
==
'
')
{
recbuf[recvcount-1]
=
0x00;
//以0x00結尾
recvcount
=
0;
//計數歸零
……後續操作
}
else
{
//如果上一個數據不為'
'則繼續接收
recbuf[recvcount++]
=
recdata;
}
}

❽ 最簡單的單片機串口接收c語言程序

#include<stc12c5a60s2.h>
/*****************************************************
函數功能:接收一個位元組數據
***************************************************/
unsigned char Receive(void)
{
unsigned char dat;
while(RI==0) //只要接收中斷標志位RI沒有被置「1」
; //等待,橋正直至接收完畢(RI=1)
RI=0; //為了接收下一幀數據,需將RI清0
dat=SBUF; //將接收緩沖器中的數據存於dat
return dat;
}
/*****************************************************
函數功能:主函數
***************************************************/
void main(void)
{
TMOD=0x20; //定時器T1工作於方式2,判滾作為波特率發生器
SCON=0x50; //SCON=0101 0000B,串口工作方式1,允許接收(REN=1)
PCON=0x00; //PCON=0000 0000B,波特率9600
TH1=0xfd; //根據規定給定時器T1賦初值
TL1=0xfd; //敏沖悔根據規定給定時器T1賦初值
TR1=1; //啟動定時器T1
REN=1; //允許接收
while(1)
{
P1=Receive(); //將接收到的數據送P1口顯示
}
}

❾ VS或者VC6.0編寫的C語言程序,怎樣能夠實現串口數據的收發

1 、Windows API通信函數方法 。與通信有關的Windows API函數共有26個,但主要有關的有: CreateFile() 用 「comn」(n為串口號)作為文件名就可以打開串口。 ReadFile() 讀串口。

2、WriteFile() 寫串口。 CloseHandle() 關閉串口句柄。初始化時應注意CreateFile()函數中串兆鍵口共享方式應設為0,串口為不可共享設備,其它與一般文件讀寫類似。以下給出API實現的源代碼。



3、利用埠函數直接操作 。這種方式主要是採用兩個埠函數_inp(), _outp()實現對串口的讀寫,其中讀埠函數的原型為: int _inp(unsigned shot port) 。該函數從埠讀取一個位元組,埠號為0~65535。 寫埠的函數原型為: nt _outp(unsigned shot port, int databyte) 。

4、 MSComm控制項 。MSComm控制項是微軟開發的專用通信控制項,封裝了串口的所有功能,使用很方便,但在實際應用中要小心對其屬性進行配置。下面詳細說明該類應用方法族坦巧。



❿ 怎樣在WINDOWS下用C語言編寫串口接收數據程序

#include <stdio.h>
#include <Windows.h>
int main(void)
{
FILE *fp;
char temp;
char buf[100];
if((fp = fopen("com3","搏罩r")) == NULL)
puts("this way doesn't work!\n");
else
puts("this way works!\n");
while(1)
{
temp = 0;
fscanf(fp,"%c",&temp);
if(temp != 0)
putchar(temp);
else
Sleep(100);
}
fclose(fp);
return 0;
}

以前弄的,好久沒看了,不知到對不對。
還有下面這芹配段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

#include <Windows.h>
#include <stdio.h>
HANDLE hCom;
int main(void)
{
hCom=CreateFile(TEXT("COM3"),//COM1口
GENERIC_READ|GENERIC_WRITE, //允許讀和寫
0, //獨占方式
NULL,
OPEN_EXISTING, //打開而不是創建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
printf("打開COM失敗!\n");
return FALSE;
}
else
{
printf("COM打開成功!\n");
}
SetupComm(hCom,1024,1024); //輸入緩沖區和輸出緩沖區的大小都是1024
COMMTIMEOUTS TimeOuts;
//設定讀超時
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//設定寫超時
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //設置超時
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率為9600
dcb.ByteSize=8; //每個位元組有8位
dcb.Parity=NOPARITY; //無奇偶校驗位
dcb.StopBits=ONE5STOPBITS; //兩個停止位嫌銀指
SetCommState(hCom,&dcb);
DWORD wCount;//讀取的位元組數
BOOL bReadStat;
while(1)
{
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空緩沖區
char str[9]={0};
printf("%s\n",str);
bReadStat=ReadFile(hCom,str,9,&wCount,NULL);
if(!bReadStat)
{
printf("讀串口失敗!");
return FALSE;
}
else
{
str[8]='\0';
printf("%s\n",str);
}
Sleep(100);
}
}

以上兩段代碼是一年前弄的,我記得可以用,你試試。

熱點內容
解壓到當前文件夾右鍵 發布:2024-04-26 03:57:08 瀏覽:979
html5android教程視頻下載 發布:2024-04-26 03:09:59 瀏覽:867
伺服器的描述是什麼 發布:2024-04-26 03:08:32 瀏覽:394
個人加密 發布:2024-04-26 03:01:23 瀏覽:520
linuxusbgadget 發布:2024-04-26 02:52:54 瀏覽:304
我的世界空島世界伺服器地址 發布:2024-04-26 01:39:08 瀏覽:248
尼爾機械紀元加密 發布:2024-04-26 01:37:11 瀏覽:867
在控制台輸出sql語句 發布:2024-04-26 01:08:12 瀏覽:432
動畫java 發布:2024-04-26 01:02:40 瀏覽:12
得力文件夾5302 發布:2024-04-26 00:21:32 瀏覽:91