c語言串口通訊
可以兩個方式:
1、如果是 MSComm控制項方式可以加入三個控制項分別控制;在OnComm事件裡面接收數據;用m_Comm.SetOutput(COleVariant(m_SendData));發送數據;
2、把 MSComm控制項 打包在一個類裡面,自己寫初始化和發送接收函數;
2. 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·設置串口參數。
3. 51單片機C語言的串口通訊協議
舉個例子
二、 串列口通訊方式:
2.1 工作方式:主從方式。上位機為主,順序閃光燈主機為從;控制命令和查詢命令由上位機發出,順序閃光燈主機做相應信息返回。
2.2 工作模式:8位數據,無校驗;對於51系列單片機為模式1
2.3 波特率:1200,2400,4800,9600(可選,預設為4800)。
2.4 信息格式:
序號 名稱 位元組數 內容 說明
1 幀信息頭 1 0xAA 用於表示信息的開始
2 幀信息類型 1 控制0x01 用於區別控制命令、查詢命令及返回信息;「控制」和「查詢」由上位機發出,「返回」為順序閃光燈主機返回信息時發出。
查詢0x02
返回0x03
3 有效信息長度 1 n 表示有效信息的位元組數
4 有效信息 n n個位元組 有效信息。詳見具體信息定義
5 校驗碼 1 LRC 對幀信息類型、有效信息長度、有效信息進行單位元組相加,取低8位補碼(即對低8位取反後再加一)作為校驗碼。
說明:上位機和順序閃光燈主機使用相同的信息格式,不同之處在於信息類型、信息長度的不同。
4. 一道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為一,便於主程序中發送響應
}
5. 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] != '