当前位置:首页 » 编程语言 » 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 11:02:12 浏览:267
python游戏服务端 发布:2025-02-13 11:00:19 浏览:927
云原生服务器 发布:2025-02-13 10:55:34 浏览:827
linuxip命令查看ip 发布:2025-02-13 10:49:45 浏览:421
java基础应用 发布:2025-02-13 10:44:53 浏览:711
linux内核抢占 发布:2025-02-13 10:36:32 浏览:890
家装公司源码 发布:2025-02-13 10:35:35 浏览:49
aspnet更新数据库 发布:2025-02-13 10:35:34 浏览:385
海尔压缩机不工作 发布:2025-02-13 10:15:32 浏览:224
才儿坊编程 发布:2025-02-13 10:09:58 浏览:730