c语言串口程序编写,用C语言编写串口程序

2023-05-16

在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬

件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言

作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言

的方便。

在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和

状态信息。这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以

及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。为解决这个

问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)

的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)

进行如下简单的编码:

0H:发送的是新的半个字节数据

1H:重新发送上次传送错误的数据

2H:文件名结束

3H:文件结束

这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就

是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节

相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通

过信息位来区分。下面就是用C语言编写控制串行口的程序。

#include "dos.h"

#include "stdlib.h"

#include "stdio.h"

#define PORT 0

void SendFile(char *fname); /* 发送文件*/

void Send(int s); /*发送一个字节*/

void SendFileName(char *fname); /*发送文件名*/

void ReceiveFile(); /*接收文件*/

void GetFileName(char *f); /*接收文件名*/

void InitPort(int port,unsigned char para); /*初始化端口*/

void SendPort(int port,char c); /*端口发送*/

int ReadPort(int port); /*读端口字节*/

int CheckState(int port); /*检查端口状态*/

int Receive(int port,int *G); /*接收一个字节*/

main(int argc,char *argv[])

{

if(argc<2){

printf("Please input R(receive) or S(sent) parametre:");

exit(1);

}

InitPort(PORT,231);

if(*argv[1]==''''S'''') /*检查选择的有效性*/

SendFile(argv[2]);

else if(*argv[1]==''''R'''')

ReceiveFile();

else{

printf("Error parament.Please input again.");

exit(1);

}

}

void SendFile(char *fname)

{

FILE *fp;

int ch,s;

if((fp=fopen(fname,"rb"))==NULL)

{

printf("Can''''t open the file.\n");

exit(1);

}

SendFileName(fname);

do{

ch=(int)getc(fp);

if(ferror(fp)){

printf("Error reading file.\n");

break;

}

s=ch%16; /*取文件中一个字节的低4位*/

Send(s);

s=ch/16; /*取文件中一个字节的高4位*/

Send(s);

}while(!feof(fp));

s=46; /*发送文件结束信息*/

Send(s);

Send(s);

fclose(fp);

}

void Send(s)

int s;

{

int G;

SendPort(PORT,s);

G=ReadPort(PORT); /*等待握手信号*/

if(s!=G)

s=s+16;

do{

SendPort(PORT,s);

G=ReadPort(PORT);/*等待握手信号*/

}while(s!=G);

}

void SendFileName(fname)

char *fname;

{

int s,ch;

printf("Now transmit the file.Please wait...");

while(*fname){

ch=(int)fname++;

s=ch%16; /*取文件名中一个字节的低4位*/

Send(s);

s=ch/16;

Send(s); /*取文件名中一个字节的低4位*/

}

s=32; /*发送文件名结束标志*/

Send(s);

Send(s);

}

void ReceiveFile(){

FILE *fp;

char ch;

int G1,G2,G3;

char fname[15];

GetFileName(fname);

printf("Receiving file %s.\n",fname);

remove(fname);

if((fp=fopen(fname,"wb"))==NULL)

{

printf("Can''''t open output file.\n");

exit(1);

}

/*循环为检测每次接受的数据是否为新数据,如果不是,*/

/*则用此次接收的数据覆盖上次接收的数据*/

G1=ReadPort(PORT);

G2=Receive(PORT,&G1);

do{

G3=Receive(PORT,&G2);

ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/

putc(ch,fp);

if(ferror(fp)){

printf("\nError writing file.");

exit(1);

}

G2=Receive(PORT,&G3);

G1=G3;

}while(G1/16!=48);

printf("\nTransmit finished.");

fclose(fp);

}

int Receive(port,G)

int port,*G;

{

int GM;

SendPort(port,*G);

GM=ReadPort(port);

if(GM/16==0)

return GM;

else if(GM/16==1){

do{

*G=GM;

SendPort(port,GM);

GM=ReadPort(port);

}while(GM/16==1);

}

return GM;

}

void GetFileName(char *f)

{

int G1,G2,G3;

char ch;

G1=ReadPort(PORT);

G2=ReadPort(PORT);

do{

G3=Receive(PORT,&G3);

ch=(char)(G1%16+G2/16);

*f=ch;

*f++;

G2=Receive(PORT,&G3);

G1=G3;

}while(G1/16!=32);

printf("File name transmit finished.\n");

}

void InitPort(port,para)

int port;

unsigned char para;

{

union REGS reg;

reg.x.dx=port;

reg.h.ah=0;

reg.h.al=para;

int86(0x14,®,®);

}

void SendPort(port,c)

int port;

char c;

{

union REGS reg;

reg.x.dx=port;

reg.h.al=c;

reg.h.ah=1;

int86(0x14,®,®);

if(reg.h.ah&128){

printf("\nSend mistakes!");

exit(1);

}

}

int ReadPort(port)

int port;

{

union REGS reg;

while(!(CheckState(port)&256)){

if(kbhit()){/*如端口长期无数据可人为终止等待*/

printf("Press any key to exit.");

getch();

exit(1);

}

}

reg.x.dx=port;

reg.h.ah=2;

int86(0x14,®,®);

if(reg.h.ah&128){

printf("\nRead mistake!");

exit(1);

}

return reg.h.al;

}

int CheckState(port)

int port;

{

union REGS reg;

reg.x.dx=port;

reg.h.ah=3;

int86(0x14,®,®);

return reg.x.ax;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言串口程序编写,用C语言编写串口程序 的相关文章

随机推荐

  • fragment的管理

    private void initData fragmentManager 61 getSupportFragmentManager fragment1 61 new Fragment1 fragment2 61 new Fragment2
  • 使用libcurl 建立长连接

    libcurl 是一个用于网络传输的开源库 xff0c 它支持多种协议 xff0c 包括 HTTP 要使用 libcurl 建立长连接 xff0c 需要设置 CURLOPT CONNECT ONLY 选项 这将告诉 libcurl 只建立连
  • C++ char* 转 char[] 给出示例代码

    char 转 char 的示例代码如下 xff1a span class hljs meta span class hljs keyword include span span class hljs string lt iostream g
  • socket的select的用法

    select 是一个用于在多个套接字上进行非阻塞 I O 操作的函数 它可以同时监视多个套接字 xff0c 并在有数据可读 可写或有错误发生时返回 该函数的语法如下 xff1a span class hljs function span c
  • python爬虫登录网页

    爬虫登录网页是指使用爬虫程序自动模拟登录流程 获取网站的数据 在 Python 中登录网页 需要使用第三方库如 requests mechanicalsoup 或者 selenium 等来实现 具体实现方法可以参考以下步骤 导入所需库 如
  • 只能选择分卷文件的第1部分_科普一下:天下无优分卷压缩附件的解压方法

    天下无优网优资料分享平台 https netopt net 处于性能考虑 xff0c 对所有上传的附件进行了10MB的附件大小限制 如果要分享超过10MB的文件 xff0c 我们推荐了使用 分卷压缩 的方式将一个大文件拆分并压缩成多个10M
  • 计算机存储器组成结构,计算机组成原理——存储器内部组成

    存储器的基本组成 这里讨论的是主存 xff0c 即内存 存储器 组成结构图 JPG 主存储器包括存储体 MAR MDR 各种逻辑部件及控制电路 存储器内部结构说明 一个主存储器 内存条 由多个存储体组成 xff0c 一个存储体中有许多存储单
  • doris和hive的区别

    Doris和Hive是两种开源的数据仓库工具 xff0c 都可以用来分析大型数据集 Doris是由阿里巴巴开发的一款大数据分析工具 xff0c 具有低延迟 高吞吐 高可扩展性等优点 它采用PAL Parallel amp Analytic
  • 如何安装chatgpt

    首先 xff0c 你需要确保你的计算机安装了 Python 环境 如果没有安装 xff0c 请参考以下网址进行安装 xff1a https www python org downloads 然后 xff0c 打开命令行窗口 在 Window
  • AttributeError: module 'numpy' has no attribute 'int'

    这个错误消息表明 xff0c 你试图访问 numpy 模块的 int 属性 xff0c 但是 numpy 模块中没有这个属性 这通常是因为你的代码中有一个语法错误 xff0c 导致 Python 解释器识别错误 具体来说 xff0c 可能是
  • listview多条目加载

    public class MyBaseAdapter extends BaseAdapter private Context context private ArrayList lt JsonBean DataBean Liketeamli
  • tensorboard怎么使用

    TensorBoard 是一个由 TensorFlow 提供的可视化工具 xff0c 可以帮助用户更好地理解和调试深度学习模型 使用 TensorBoard xff0c 您可以可视化训练过程中的损失和指标 模型结构 梯度直方图 嵌入向量等等
  • 写一段java主动发送请求的示例代码

    String url 61 34 http example com example php 34 try URL obj 61 new URL url HttpURLConnection con 61 HttpURLConnection o
  • idea chatGPT 插件 如何使用

    IDEA ChatGPT 插件是一个使用 OpenAI 的 GPT 3 模型的插件 xff0c 它能够帮助您生成代码 xff0c 提供代码自动完成和错误修复功能 要使用该插件 xff0c 您需要先在 IDEA 中安装插件 您可以在 IDEA
  • mybatisplus使用LambdaQueryWrapper查询时怎么将查询结果中所有的id放入数组中

    可以使用LambdaQueryWrapper的listObjs方法来查询数据库中所有符合条件的记录的某一个字段 xff0c 并将这些字段值放入一个数组中 具体实现方法如下 xff1a span class hljs built in Lis
  • 编写一个C语言程序,能够实现求斐波那契数列

    好的 这是一个实现求斐波那契数列的C语言程序 span class hljs meta span class hljs keyword include span span class hljs string lt stdio h gt sp
  • 添加数据库

    public class MySqlite extends SQLiteOpenHelper public MySqlite Context context super context 34 MyInfo 34 null 2 public
  • LINUX COUT没有定义,'cout'不是'std'的成员并且'cout'未在此范围内声明

    我意识到有几个像这样的重复项 xff0c 但是迄今为止他们都没有为我工作 我想在Ubuntu上使用g 43 43 编译C 43 43 非常简单的程序 xff0c 但它给我的范围错误 39 cout 39 不是 39 std 39 的成员并且
  • gpio_typedef_stm32库函数GPIO_Init()解析

    首先是引脚定义 define GPIO Pin 0 uint16 t 0x0001 Pin 0 selected define GPIO Pin 1 uint16 t 0x0002 Pin 1 selected define GPIO Pi
  • c语言串口程序编写,用C语言编写串口程序

    在当今 流行的编程软件种类繁多 xff0c 它们编程方便 易于维护 xff0c 但是在与硬 件直接打交道和编制系统软件时却束手无策 xff0c 于是C语言就有了用武之地 C语言 作为汇编语言与高级语言之间的一种过渡语言 xff0c 兼有汇编