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

c語言串口通訊

發布時間: 2022-05-23 20:44:10

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

{

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語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。



6. 如何用C語言控制計算機串口

基本方法是使用CreateFile來建立一個串口文件,然後用overlap的方式進行讀寫

#define SERAIL_PORT_BUF_MAX (1024*8)
typedef HRESULT (*PFN_CMD_PARSE_DATA)(HANDLE hParseApp, LPCSTR szRspCmd, int nCmdLen);

class CUsbSrvApp// : public CWinApp
{
public:
CUsbSrvApp();
~CUsbSrvApp();
BOOL OnSendData(const char *szBuf, int nLen);// 發送數據
int ComConnect(CString strPort); // 連接COM口
HANDLE OpenComPort(CString strPort, int nBaudRate, int nDataBits, int nStopBits, int nParity, int nFlowCtrlType); // 打開串口
void Close(); // 關閉串口

HANDLE m_hCom;
BOOL m_bConnected;
OVERLAPPED m_OverlappedRead;
OVERLAPPED m_OverlappedWrite;
CWinThread *m_pThread;

PFN_CMD_PARSE_DATA m_pRspCmdFunc; // 用來處理接受數據的CALLBACK
HANDLE m_hParseApp;
};

CUsbSrvApp::CUsbSrvApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
m_bConnected = false;
m_hCom = NULL;
m_pRspCmdFunc = NULL;
}

CUsbSrvApp::~CUsbSrvApp()
{
}
//打開串口通信,並返回串口句柄
HANDLE CUsbSrvApp::OpenComPort(CString strPortName,
int nBaudRate,
int nDataBits,
int nStopBits,
int nParity,
int nFlowCtrlType)
{
DCB dcb;
COMMTIMEOUTS CommTimeOuts ;
COMMCONFIG ComConfig;
HANDLE hComPort;

CString strPort;
strPort.Format("\\\\.\\%s",strPortName); // COM口的文件名應該是 \\.\COMXX

//打開窗口其實就是創建一個文件
hComPort = CreateFile(strPort,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);

if (INVALID_HANDLE_VALUE == hComPort)
return INVALID_HANDLE_VALUE;

// 設置一些COM口通訊參數和OVERLAP
CommTimeOuts.ReadIntervalTimeout = -1;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0x1388;
SetCommTimeouts( m_hCom, &CommTimeOuts ) ;

SetDefaultCommConfig(strPortName, &ComConfig, sizeof(COMMCONFIG));
GetCommState(m_hCom, &dcb ) ;

dcb.BaudRate = nBaudRate;
dcb.ByteSize = nDataBits;
dcb.StopBits = nStopBits;
dcb.fParity = (NOPARITY != nParity);
dcb.Parity = nParity;
//set the receive char
dcb.EvtChar = 0x0D;

switch(nFlowCtrlType)
{
case 0: //no flow control
break;

case 1://HARD_FLOW_CTRL:

dcb.fOutxCtsFlow = TRUE;
dcb.fOutxDsrFlow = TRUE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = TRUE;
dcb.fRtsControl = RTS_CONTROL_TOGGLE;
break;

case 2://SOFT_FLOW_CTRL:
dcb.fOutX = TRUE;
dcb.fInX = TRUE;
break;
}
BuildCommDCB(_T("baud=115200 parity=N data=8 stop=1"),&dcb);
SetCommState(hComPort, &dcb ) ;
SetCommMask(hComPort, 0);
SetCommMask(hComPort, EV_RXCHAR|EV_CTS|EV_DSR|EV_RLSD|EV_RING);
SetupComm( hComPort, SERAIL_PORT_BUF_MAX,SERAIL_PORT_BUF_MAX) ;
//clear read and write buffer
PurgeComm( hComPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

return hComPort;
}

void CUsbSrvApp::Close()
{
if(m_bConnected)
{
m_bConnected = false;
CloseHandle(m_hCom);
m_hCom = NULL;
}
}

// 這個線程是監視串口數據,一旦有數據則讀取並調用CALLBACK通知客戶端
UINT ReceiveComData(LPVOID pParam)
{
CUsbSrvApp *pUsbSrv = (CUsbSrvApp *)pParam;
HANDLE hComPort = pUsbSrv->m_hCom;

DWORD dwEvtMask=0;
DWORD dwErrorFlags;

SetCommMask( hComPort, EV_RXCHAR);
OVERLAPPED osRead;
osRead.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
DWORD dwTransfer = 0;
while(pUsbSrv->m_bConnected)
{
if( !WaitCommEvent( hComPort, &dwEvtMask,&osRead))
{
if( GetLastError()== ERROR_IO_PENDING)
{
WaitForSingleObject(osRead.hEvent, INFINITE);
if(dwEvtMask&EV_RXCHAR==EV_RXCHAR)
{
COMSTAT ComStat={0} ;
DWORD dwReadLen = 0;
DWORD dwBytesRead = 0;
DWORD dwTotalLen = 0;
ClearCommError(hComPort, &dwErrorFlags, &ComStat );
dwTotalLen = ComStat.cbInQue;
dwReadLen = (SERAIL_PORT_BUF_MAX > dwTotalLen)?dwTotalLen:SERAIL_PORT_BUF_MAX;

BYTE *pBuf = new BYTE[dwTotalLen+1];
memset(pBuf, 0 , dwTotalLen+1);
DWORD nReadBufLen=0;
while(dwTotalLen>0)
{

if(FALSE == ReadFile( hComPort, pBuf+nReadBufLen,dwReadLen, &dwBytesRead,&pUsbSrv->m_OverlappedRead))
{
if(GetLastError() == ERROR_IO_PENDING)
{
GetOverlappedResult(hComPort,&osRead, &dwTransfer, TRUE );
}
break;
}

nReadBufLen +=dwBytesRead;
dwTotalLen -=dwBytesRead;
dwReadLen -= dwBytesRead;
dwReadLen = (SERAIL_PORT_BUF_MAX>dwReadLen)?dwReadLen:SERAIL_PORT_BUF_MAX;
}
if(pUsbSrv->m_pRspCmdFunc!=NULL&&nReadBufLen!=0)
{
pUsbSrv->m_pRspCmdFunc(pUsbSrv->m_hParseApp, (char*)pBuf,nReadBufLen);
}

delete pBuf;

ClearCommError(hComPort, &dwErrorFlags, &ComStat );
int len =0;//= m_retList.GetSize();
}//endif if(dwEvtMask&EV_RXCHAR==EV_RXCHAR)
}//endif if( GetLastError()== ERROR_IO_PENDING)
}//endif if( !WaitCommEvent( hComPort, &dwEvtMask,&o))
else
{
if(GetLastError() == ERROR_IO_PENDING) {
GetOverlappedResult(hComPort, &osRead, &dwTransfer, TRUE ); // sleep thread
}
}
Sleep(1);
} //endwhile while(m_bConnected)
return 0;
}

int CUsbSrvApp::ComConnect(CString strPort)
{
int nBaudRate = 115200;
int nDataBits = 8;
int nStopBits = 1;
int nParity = 0;
int nFlowCtrl = 1;

if (NULL != m_hCom || m_bConnected)
{
return 0;
}
m_hCom = OpenComPort(strPort,nBaudRate,nDataBits,nStopBits,nParity,nFlowCtrl);
if( INVALID_HANDLE_VALUE == m_hCom)
{
m_hCom = NULL;
return 0;
}
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

m_pThread = AfxBeginThread( ReceiveComData,(void*)this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED ,NULL );

if( NULL == m_pThread )
{
CloseHandle( m_hCom );
m_hCom = NULL;
return FALSE;
}
else
{
m_bConnected = TRUE;
m_pThread->ResumeThread( );
}

return TRUE;
}

int CUsbSrvApp::OnSendData(const char *szBuf, int nLen)
{
BOOL bWriteStat;
BOOL bWrite = TRUE;
DWORD dwBytesWrite = 0;
DWORD dwBytesWritten = 0;
int dwByteswrittenTotal = 0;

if (NULL == m_hCom)
return 0;

int nSentTimes=0;

while(dwByteswrittenTotal<nLen&&nSentTimes<10)
{
nSentTimes++;
dwBytesWrite = nLen-dwByteswrittenTotal;
bWriteStat = WriteFile( m_hCom, szBuf+dwByteswrittenTotal, dwBytesWrite, &dwBytesWritten, &m_OverlappedWrite );

if( !bWriteStat)
{
if ( GetLastError() == ERROR_IO_PENDING )
{
dwBytesWritten = 0;
bWrite = FALSE;
}
}
if (!bWrite)
{
bWrite = TRUE;

bWriteStat = GetOverlappedResult(m_hCom, // Handle to COMM port
&m_OverlappedWrite, // Overlapped structure
&dwBytesWritten, // Stores number of bytes sent
TRUE); // Wait flag
//deal with the error code
}
dwByteswrittenTotal += dwBytesWritten;
}
if(dwByteswrittenTotal<nLen)
return 0;
else
return 1;
}

7. 串口通訊方式2,用C語言如何初始化

//初始化串口
void UART_Init(void)
{
PCON &= 0x7f; //波特率不加倍
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x40; //12倍速(1T)
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1為8位自動重裝方式
TL1 = 256 - (uchar)(FOSC / BAUD1 / 32 + 0.5);
TH1 = TL1;
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
ES = 1; //啟動串口中斷
TI = 0;
S2CON = 0x50; //串口2設置為8位數據,可變波特率
AUXR &= 0xF7; //波特率不倍速
BRT = 256 - (uchar)(FOSC / BAUD2 / 32 + 0.5);
AUXR |= 0x14; //獨立波特率發生器時鍾為Fosc,即1T
AUXR1 &= 0xEF; //串口2位於P1埠
P1M0 |= 0x08; //確保第二串口TXD引腳(P1.3)有足夠的驅動能力
P1M1 |= 0x04;
P1 |= 0x0C;
IE2 |= 0X01;
P4M0 |= 0x08; //確保第二串口TXD引腳(P4.3)有足夠的驅動能力
P4 |= 0x0C;
ES = 1; //允許串口中斷
}
//串口發送數據
void SendChar(uchar port, uchar n)
{
EA = 0;

switch(port)
{
case 1:
SBUF = n;
while(TI==0);
TI = 0;
break;
case 2:
AUXR1 &= 0xEF; //串口2位於P1埠
_nop_();
S2BUF = n;
while((S2CON&0x02)==0); //發送數據
S2CON &= 0xfd;
break;
case 3:
AUXR1 |= 0x10; //串口2位於P4埠
_nop_();
S2BUF = n;
while((S2CON&0x02)==0); //發送數據
S2CON &= 0xfd;
break;
}
EA = 1;
}

8. 用C語言實現89C51串口通信程序

void
Send_Byte(uchar
i)
{
WDI
=
~WDI;
TI
=
0;
SBUF
=
i;
while(TI==0)
WDI
=
~WDI;
TI
=
0;
}
void
Send_String(uchar
*string)
{
while(*string!=0)
{
Send_Byte(*string);
string
++;
}
}
void
Com_A_Int()
interrupt
4
{
uchar
idata
status;
status
=
SBUF;
RI
=
0;
if
(status
==
0x02)
Send_String("HELLO")
if
(status
==
0x55)
Send_String("THIS
IS
A
WELL
BEGIN!")
}
這是串口中斷程序,其他的你可以自己根據實際情況編寫

9. c語言怎麼實現串口通信

編程原理
程序1為查詢通信方式介面程序,為一典型的數據採集常式。其中bioscom()函數初始化COM1(此函數實際調用BIOS
INT
14H中斷0號功能)。這樣在程序中就避免了具體設置波特率因子等繁瑣工作,只需直接訪問發送/接收寄存器(3F8H)和線路狀態寄存

10. 急!!!單片機C語言實現串口通信編程

如果在字元數字發送框發0X00蜂鈴器就會叫,如果發0xff蜂鈴器就停叫。

#include <REG52.H>
#include <stdio.h>
sbit BEEP = P1^4;
unsigned char b;

void main (void) {
SCON = 0x50; //REN=1允許串列接受狀態,串口工作模式1
TMOD|= 0x20; //定時器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、數據位8、停止位1。效驗位無 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、數據位8、停止位1。效驗位無 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //開串口中斷
EA = 1; // 開總中斷
BEEP=1;
// IE = 0x0;

while(1)
{

if (RI) //RI接受中斷標志
{ RI=0; //清除RI接受中斷標志
b=SBUF; //SUBF接受/發送緩沖器
}
BEEP=b;

}

}

這個是個發送程序,接收程序類似,不懂可繼續追問,一般人都是在別人程序基礎上改改稱為自己的,希望樓主能夠自己研究出自己的一套編程理論

熱點內容
腳本師傳奇 發布:2025-02-13 14:45:48 瀏覽:480
我的世界lce伺服器剪輯 發布:2025-02-13 14:40:50 瀏覽:624
phpsftp上傳 發布:2025-02-13 14:35:43 瀏覽:273
c學生管理系統資料庫 發布:2025-02-13 14:21:41 瀏覽:122
傳奇添加會員腳本 發布:2025-02-13 14:20:50 瀏覽:205
微信開發平台源碼 發布:2025-02-13 14:14:20 瀏覽:613
安卓大屏屏幕休眠是什麼意思 發布:2025-02-13 14:13:28 瀏覽:464
腳本的參數設置 發布:2025-02-13 14:11:57 瀏覽:863
androidtexture 發布:2025-02-13 14:11:57 瀏覽:393
怎麼取消網路密碼怎麼設置 發布:2025-02-13 14:11:54 瀏覽:426