當前位置:首頁 » 編程語言 » c語言串口通信程序

c語言串口通信程序

發布時間: 2025-06-15 01:55:52

A. 51單片機串口通信c語言編程

#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int

sbit ring=P3^7;
sbit CASE1=P2^0;
sbit CASE2=P2^1;
sbit CASE3=P2^2;
sbit CASE4=P2^3;

uchar se=0,re=0;
uchar temp=0;

void wait(uint cnt)
{
while(--cnt);
}

//串口發送程序
void send(uchar se)
{
SBUF=se; //發送數據
while(TI == 0);
TI = 0;
}
//串口接收程序
uchar receive(void)
{
re=SBUF; //接收數據
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}

//主程序
int main (void)
{
int i;
sinti(); //串口初始化程序
ring=1;
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a');
ring=0;
break;
}
if(CASE2==0)
{
send('b');
ring=0;
break;
}
if(CASE3==0)
{
send('c');
ring=0;
break;
}
if(CASE4==0)
{
send('d');
ring=0;
break;
}
}
if(ring==0)
{
wait(60000);
ring=1;
}
for(i=0;i<10000;i++);
}
}
//串口中斷程序
void UART_SER (void) interrupt 4 //串列中斷服務程序
{

if(RI) //判斷是接收中斷產生
{
RI=0; //標志位清零
temp=SBUF;
}
if(TI) //如果是發送標志位,清零
TI=0;
}

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



C. 串口通信如何使用MODBUS協議舉個C語言的例子。

Modbus兩種協議的編程方法:

1、LRC校驗
LRC域是一個包含一個8位二進制值的位元組。LRC值由傳輸設備來計算並放到消息幀中,接收設備在接收消息的過程中計算LRC,並將它和接收到消息中LRC域中的值比較,如果兩值不等,說明有錯誤。
LRC校驗比較簡單,它在ASCII協議中使用,檢測了消息域中除開始的冒號及結束的回車換行號外的內容。它僅僅是把每一個需要傳輸的數據按位元組疊加後取反加1即可。下面是它對應的代碼:

BYTE GetCheckCode(const char * pSendBuf, int nEnd)//獲得校驗碼
{
BYTE byLrc = 0;
char pBuf[4];
int nData = 0;
for(i=1; i<end; i+=2) //i初始為1,避開「開始標記」冒號
{
//每兩個需要發送的ASCII碼轉化為一個十六進制數
pBuf [0] = pSendBuf [i];
pBuf [1] = pSendBuf [i+1];
pBuf [2] = '\0';
sscanf(pBuf,"%x",& nData);
byLrc += nData;
}

byLrc = ~ byLrc;
byLrc ++;
return byLrc;
}

2、CRC校驗
CRC域是兩個位元組,包含一16位的二進制值。它由傳輸設備計算後加入到消息中。接收設備重新計算收到消息的CRC,並與接收到的CRC域中的值比較,如果兩值不同,則有誤。
CRC是先調入一值是全「1」的16位寄存器,然後調用一過程將消息中連續的8位位元組各當前寄存器中的值進行處理。僅每個字元中的8Bit數據對CRC有效,起始位和停止位以及奇偶校驗位均無效。
CRC產生過程中,每個8位字元都單獨和寄存器內容相或(OR),結果向最低有效位方向移動,最高有效位以0填充。LSB被提取出來檢測,如果LSB為1,寄存器單獨和預置的值或一下,如果LSB為0,則不進行。整個過程要重復8次。在最後一位(第8位)完成後,下一個8位位元組又單獨和寄存器的當前值相或。最終寄存器中的值,是消息中所有的位元組都執行之後的CRC值。
CRC添加到消息中時,低位元組先加入,然後高位元組。下面是它對應的代碼:
WORD GetCheckCode(const char * pSendBuf, int nEnd)//獲得校驗碼
{
WORD wCrc = WORD(0xFFFF);
for(int i=0; i<nEnd; i++)
{
wCrc ^= WORD(BYTE(pSendBuf[i]));
for(int j=0; j<8; j++)
{
if(wCrc & 1)
{
wCrc >>= 1;
wCrc ^= 0xA001;
}
else
{
wCrc >>= 1;
}
}
}
return wCrc;
}

對於一條RTU協議的命令可以簡單的通過以下的步驟轉化為ASCII協議的命令:

1、 把命令的CRC校驗去掉,並且計算出LRC校驗取代。
2、 把生成的命令串的每一個位元組轉化成對應的兩個位元組的ASCII碼,比如0x03轉化成0x30,0x33(0的ASCII碼和3的ASCII碼)。
3、 在命令的開頭加上起始標記「:」,它的ASCII碼為0x3A。
4、 在命令的尾部加上結束標記CR,LF(0xD,0xA),此處的CR,LF表示回車和換行的ASCII碼。

掌握兩種協議的編程方法,剩下的就是C語言的問題了。

悉雨辰寂

D. C語言編程:如何同時打開多個串口進行通信

可以兩個方式:
1、如果是 MSComm控制項方式可以加入三個控制項分別控制;在OnComm事件裡面接收數據;用m_Comm.SetOutput(COleVariant(m_SendData));發送數據;
2、把 MSComm控制項 打包在一個類裡面,自己寫初始化和發送接收函數;

E. 一道51單片機的C語言程序,關於串口通訊的,很簡單......

#include<reg52.h> //增強型52寄存器的定義
#define uchar unsigned char //用uchar代替unsigned char
#define uint unsigned int //用uint代替unsigned int
unsigned char flag,a,i; //定義變數flag,a,i
uchar code table[]="I receive,thanks"; //定義一個字元串數組

void init()
{
} //設置工作方式,這個懂。

void main()
{
init(); //系統初始化,你懂的
while(1) //主循環部分,一直運行
{
if(flag==1) //等待flag標志位置位,當接收到數據的時候在串口接收中斷中置位
{
ES=0; //禁止串口中斷,但是注意發送中斷標志位的置位仍然正常
for(i=0;i<18;i++) //for循環為了一個個把之前定義的字元串
{
SBUF=table[i]; //向串口收發緩沖器中寫入回應的內容「I receive,thanks」
while(!TI); //等待發送完成,發送中斷標志被置一,否則while循環一直進行
TI=0; //清除發送中斷標志位
}
SBUF=a; //繼續通過串口向串口收發緩沖器發送a,回顯收到的數據
while(!TI); //等待發送完成
TI=0; //清除發送中斷標志位
ES=1; //重新使能串口中斷
flag=0; //清除flag,為了等待下一次接收
}
}
}
void serial() interrupt 4 //串口中斷服務程序,優先順序為4
{
RI=0; //當接收完成之後RI被置一,發生串口中斷,清標志位
a=SBUF; //讀取收到的字元,並賦給變數a
flag=1; //置接收完成標志flag為一,便於主程序中發送響應
}

熱點內容
我的世界伺服器怎麼搞生存區 發布:2025-06-15 13:37:10 瀏覽:629
游戲伺服器sa什麼意思 發布:2025-06-15 13:31:42 瀏覽:645
列印取消怎麼設置密碼 發布:2025-06-15 13:25:58 瀏覽:565
java程序的種類有 發布:2025-06-15 13:25:57 瀏覽:725
archlinux安裝 發布:2025-06-15 13:03:26 瀏覽:34
ftp設置win10 發布:2025-06-15 12:49:07 瀏覽:683
家庭客棧腳本怎麼寫 發布:2025-06-15 12:43:21 瀏覽:9
白蛇緣起迅雷下載ftp 發布:2025-06-15 12:43:14 瀏覽:475
遠征ol手提電腦怎麼配置 發布:2025-06-15 12:35:06 瀏覽:677
C語言字元串最長 發布:2025-06-15 12:34:54 瀏覽:356