当前位置:首页 » 编程语言 » c语言读写串口

c语言读写串口

发布时间: 2022-05-21 16:59:21

❶ 如何用c语言写一个读、写串口的程序

大致过程就是

配置串口通信,包括串口号、波特率、校验位、停止位这些信息;
打开串口,和打开文件一样,在Linux下是这样,Windows下没试过,估计也差不多;
发送数据,即写串口,就跟写文件类似;
读取串口,用read就行。
具体的函数和配置参数可以参考一些别人的代码。

❷ 用C语言读取串口数据

调用输入输出的函数,它的参数大概是端口地址和缓冲区(好像是哈,TC2.0里是有的,好像是input,其它版本的C也应该有类似的函数)——跟windows里面的deviceiocontrol()很类似的,
调用它就可以啦
当然你要先把串口设置好,比如波特率之类的

❸ 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语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。



❹ windows下C语言怎么对串口进行读写操作

windows下对串口的操作可以通过WindowsAPI进行,也可以通过Linux下的read什么的直接操作,但是这种情况需要了解电路结构,比较麻烦,第三种有第三方提供的库,但是大多数针对C++,所以可能比较难找到顺手的第三方库.
那么,接下来就见要介绍一下串口通信用WindowsAPI通信的方式.

我们会发现,在文件名的位置填上"comX" X表示com口号,超过十的com口号需要另外的书写方式,这里不说了,因为网上一抓一大把,接下来,我们要对串口进行一系列的明确设置,这里就用到了一个结构体DCB结构,是专门用来描述一个com口的工作方式的,由于次结构体有28个成员,非常多,而且大部分的设置都是全世界通用的,所以,我们偷个懒,在打开一个com口之后,建立DCB结构体,接下来调用一个函数GetCommState用这个函数把现在com口的数据都写到DCB里,这样,比较通用的com口设置就已经弄好了,我们一般情况下只需要改一下DCB的波特率就好了,改好后马上用SetCommState把刚改好的结构体再写回去,这样串口就设置好了,现在还有点麻烦,串口设置好了,我们要它干什么呢?废话,读写数据呗,嘟~~~~~~可不能用fwrite和fread因为这个com口句柄不是文件句柄,是内核句柄,要用ReadFile和WriteFile来进行读写,又出麻烦了,我们怎么知道单片机什么时候发数据过来,就算我们知道,计算机什么时候知道啊?所以,一般的情况下,用ReadFile一直在哪检查,又是麻烦,通常情况下,一个com口的ReadFile设置是阻塞函数,影响编程啊!!!!!!

怎么办,很简单,你不阻塞吗,打通你呗,我们再建立里一个结构体COMMTIMEOUTS这个结构体描述里一个com口的相关超时设置,我们用GetCommTimeouts把数据读回来,具体的设置方法在网上也有,但是要注意,有一个MAXDWORD用它来设置读间隔超时设置就可以使ReadFile向kbhit()函数一样完全非阻塞了.
经过一些列的设置,事实上,现在已经可以通信了,要是有人觉得缓存不舒服,用SetupComm函数来重设缓存大小,对于传输速度比较快的通信,要把缓存设置的大些.

❺ c语言串口读写的问题,下面是代码,怎么写完以后怎么判断可以读了呢

每一次read都需要fseek的
写完后需要fseek的

如果fseek之后还不行,你试试flush

❻ windows下怎么用C语言读取串口里的数据

Windows下的语言读取串口的数据,可以通过USB的一些特定连接。

❼ 怎么用C语言中断方式实现串口的读写

#include <stdio.h>
#include <dos.h>
#include <time.h>

#define LSB 0
#define MSB 1

#define RXR 0
#define TXR 0
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6

#define Com1_base 0x3f8
#define uchar unsigned char

volatile uchar inputData;
volatile uchar onInput = 0x00;
volatile uchar onOutput = 0x00;
volatile uchar inputdata[256]; /*设设置接收缓冲区大小*/
volatile unsigned int count; /*中断接收的数据数目*/
int datacount;/*当前已发送数据条数*/

void interrupt (*OldVect)(); /*函数是用来获取中断处理程序的入口地址的*/
void interrupt SerialISR();

void InitCom()
{
uchar inttemp;
/*设置波特率什么的*/
outportb(Com1_base+LCR,0x80); /*使LCR的高位为1,以便读取其它寄存器*/
outportb(Com1_base+LSB,0x0c); /*除数锁存器(低8位)DLL*/
outportb(Com1_base+MSB,0x00); /*除数锁存器(高8位)DLH 产生2400波特率*/
outportb(Com1_base+LCR,0x03); /*8位数据,1位停止位,无校验*/
outportb(Com1_base+IER,0x01); /*接收采用中断方式*/

/*设置中断向量*/
OldVect = getvect(0x0c); /*函数是用来获取中断处理程序的入口地址的*/
disable();
inttemp = inportb(0x21)&0xef;
outportb(0x21,inttemp);
setvect(0x0c,SerialISR); /*设置SerialISR的中断入口地址为0X0C*/
enable();
}

void CloseCom()
{
disable();
outportb(Com1_base+IER,0x00); *禁止中断*/
outportb(Com1_base,0x00);
outportb(0x21,inportb(0x21)|~(0xef));
setvect(0x0c,OldVect);
}

void interrupt SerialISR()
{
/*串口中断服务代码*/
inputData = inportb(Com1_base+RXR);
onInput = 0x01;
inputdata[count]=inputData;
count++;
/*服务代码结束*/
outportb(0x20,0x20); /*中断结束的代码*/
}

void SendChar(uchar key)
{
while( ((inportb(Com1_base + LSR)) & 0x40) == 0);
outportb(Com1_base + TXR,key);
}
/*...........延时函数......................*/
void delay(unsigned int n)
{
unsigned int i,k;
for(k=0;k<n;k++)
{
for(i=1;i<1142;i++)
;
}
}

/*........CDMA命令发送函数.................*/
void CDMA_CommandSend(char *p,unsigned int n)
{

int i,k,m,l;
int flag=0;
int selse_flag=0; int selse_flag_1=0;
int selse_flag1=0;int selse_flag1_1=0;
time_t start,end;
double dif=0;
char a;

uchar bExit_flag = 0x00;
count=0;
while(!bExit_flag)
{
count=0;
for(i=0;i<n;i++)
{SendChar(*p);delay(9000);p++;}

/*..........等待2S..................*/
time (&start);
dif=0;
while(dif<2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
if(count>14)
{
time (&start);
dif=0;
while(dif<3)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
}

/*..........判断发送命令是否成功..................*/
for(m=0;m<count;m++)
{
if(count>10)
{
for(l=0;l<count;l++)
{
if(inputdata[l-1]=='N'&&inputdata[l-2]=='E'&&inputdata[l-3]=='P'&&inputdata[l-4]=='O'&&inputdata[l-5]=='P'&&inputdata[l-6]=='P'&&inputdata[l-7]=='P'&&inputdata[l-8]=='V') { selse_flag_1=1;}
if(inputdata[l-1]=='N'&&inputdata[l-2]=='E'&&inputdata[l-3]=='P'&&inputdata[l-4]=='O'&&inputdata[l-5]=='P'&&inputdata[l-6]=='C'&&inputdata[l-7]=='T'&&inputdata[l-8]=='V') { selse_flag1_1=1;}
}

if(selse_flag_1==1){if(inputdata[m-1]=='3'&&inputdata[m-2]=='3'&&inputdata[m-3]==':'&&inputdata[m-4]=='T') selse_flag=1;}
if(selse_flag1_1==1){if(inputdata[m-1]=='0'&&inputdata[m-2]==','&&inputdata[m-3]=='1'&&inputdata[m-4]==':'&&inputdata[m-5]=='N') selse_flag1=1;}

if(selse_flag_1==1||selse_flag1_1==1)
{
if(selse_flag==1) {if(inputdata[m-1]=='0'&&inputdata[m-2]==':'&&inputdata[m-3]=='N'&&inputdata[m-4]=='E') flag=1;}
if(selse_flag1==1) {if(inputdata[m-1]=='0'&&inputdata[m-2]==','&&inputdata[m-3]=='1'&&inputdata[m-4]==':'&&inputdata[m-5]=='S') flag=1;}
}
else {if(inputdata[m-1]=='O'&&inputdata[m]=='K') {flag=1; }}
}
else {if(inputdata[m-1]=='O'&&inputdata[m]=='K') flag=1; }
}
if(flag==1){bExit_flag = 0x01;}
else {p=p-n; }

for(i=0;i<count;i++) printf("%c",inputdata[i]);
/*........按空格停止测试.............................*/
if(kbhit()){a=getch(); if(a==' '){CloseCom(); exit(1);}}

}
}

/*........数据测试发送任务.....................*/
void Data_Send(char *pcomd,int n,char *pdata,int m)
{
int i,k,l;time_t start,end;
double dif=0;
count=0;
for(i=0;i<n;i++)
{
SendChar(*pcomd);delay(9000);pcomd++;
}
time (&start);
dif=0;
while(dif<0.2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}

for(l=0;l<m;l++)
{
SendChar(*pdata);pdata++;
}

printf("The data num:%d",datacount);
datacount++;
}

void main()
{int i;char a;
/*........模块测试命令..................................*/
uchar CDMA_COMMAND_1[]={"at\r"};
uchar CDMA_COMMAND_2[]={"atz\r"};
uchar CDMA_COMMAND_3[]={"ate1v1\r"};
uchar CDMA_COMMAND_4[]={"AT+CRM=1;+CPS=33;+CMUX=1;+CTA=0\r"};
uchar CDMA_COMMAND_5[]={"AT+VPPPOPEN\r"};
uchar CDMA_COMMAND_6[]={"AT+VTCPOPEN=1,\"60.63.42.129\",1234\r"};
uchar CDMA_COMMAND_7[]={"AT+VTCPSEND=1,20\r"};
uchar CDMA_DATA[]={"ABCDEFGHIJKLMNOPQRST"};
uchar CDMA_COMMAND_9[]={"AT+VPPPCLOSE\r"};
uchar CDMA_COMMAND_8[]={"AT+VTCPCLOSE=1\r"};
uchar bExit_flag1 = 0x00;
time_t start,end;
double dif=0;
InitCom();/*初始化端口1*/
inputData = inportb(Com1_base+RXR);
while(!bExit_flag1)
{
/*.................................................................*/
if(kbhit()) /*按任意键开始测试CDMA*/
{
/*.............................................................. ...*/

/*.........发送TCP断开命令.....................................*/
CDMA_CommandSend(CDMA_COMMAND_8,strlen(CDMA_COMMAND_8));
/*.........发送PPP断开命令......................................*/
CDMA_CommandSend(CDMA_COMMAND_9,strlen(CDMA_COMMAND_9));

/*.........发送AT命令..........................................*/
CDMA_CommandSend(CDMA_COMMAND_1,strlen(CDMA_COMMAND_1));
/*.........发送ATZ命令.........................................*/
CDMA_CommandSend(CDMA_COMMAND_2,strlen(CDMA_COMMAND_2));
/*.........发送ATE1V1命令......................................*/
CDMA_CommandSend(CDMA_COMMAND_3,strlen(CDMA_COMMAND_3));
/*.........发送AT初始化命令....................................*/
CDMA_CommandSend(CDMA_COMMAND_4,strlen(CDMA_COMMAND_4));
/*.........发送PPP拔号命令.....................................*/
CDMA_CommandSend(CDMA_COMMAND_5,strlen(CDMA_COMMAND_5));
/*.........发送网络连接命令....................................*/
CDMA_CommandSend(CDMA_COMMAND_6,strlen(CDMA_COMMAND_6));
/*.........发送数据............................................*/
datacount=0;
while(1)
{
Data_Send(CDMA_COMMAND_7,strlen(CDMA_COMMAND_7),CDMA_DATA,strlen(CDMA_DATA));

time (&start);
dif=0;
while(dif<0.2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}

if(kbhit()){a=getch(); if(a==' '){bExit_flag1 = 0x01; break;}}
}
/*.........发送TCP断开命令.....................................*/
for(i=0;i<3;i++)
CDMA_CommandSend(CDMA_COMMAND_8,strlen(CDMA_COMMAND_8));
/*.........发送PPP断开命令......................................*/
for(i=0;i<3;i++)
CDMA_CommandSend(CDMA_COMMAND_9,strlen(CDMA_COMMAND_9));

bExit_flag1 = 0x01;
}

/*.................................................................*/

}
CloseCom(); /*关闭端口1*/
printf("Bye~.\n");
}

❽ 大佬们我用C语言写串口但是接收的数据不全是啥情况啊(波特率没问题)

你试试把ReadFile每次接收的字节设置小一点,然后循环接收。一口吃不了胖子。

❾ C语言用read读取串口信息,按每字节读取和一次性读取一定长度效率上有区别吗

肯定有区别的,而且相差还比较大。
因为read是用户态程序,然后每read一次都对应一次系统调用 (从用户态切换到内核态,再切回到用户态),其实耗时最多的就是状态切换。
如果一次性读取5个字节,那么就只有一次系统调用(两个状态切换),
如果一次读一字节,需要读5次,就有5次系统调用 (10个状态切换)。
具体相差多大,跟实际的环境有关,测试的话要大量的数据才能看出来。

❿ windows下C语言怎么对串口进行读写

WIN32 API 中 CreateFile/ReadFile/WriteFile等函数,配合串口的设置函数和结构体

~~~~~~~~~~~~~~~

热点内容
java旋转 发布:2025-02-14 00:22:49 浏览:103
存储虚拟化方案 发布:2025-02-14 00:21:15 浏览:695
ubuntupython3安装 发布:2025-02-14 00:14:45 浏览:661
和平精英怎么更新比较快安卓 发布:2025-02-14 00:14:35 浏览:974
怎么改密码锁 发布:2025-02-13 23:47:39 浏览:852
androidbitmap获取大小 发布:2025-02-13 23:47:38 浏览:559
怎么把升级鸿蒙系统变回安卓 发布:2025-02-13 23:36:07 浏览:595
偶校验c语言 发布:2025-02-13 23:22:52 浏览:937
芒果如何提取离线缓存视频 发布:2025-02-13 23:16:12 浏览:793
王者荣耀微信区安卓哪里分低 发布:2025-02-13 23:14:10 浏览:658