发送和接收数据
SPI数据发送与接收机制

SPI数据发送与接收机制1 SPI简介SPI是一个环形总线结构,以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线(单向传输时,3根线也可以),由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换,允许MCU 以全双工的同步串行方式。
只规定了每一帧数据如何传输,并未对帧结构的组成做介绍。
2 SPI特点2.1 采用主-从模式的控制方式两个SPI设备之间通信必须由主设备来控制次设备。
一个主设备可以通过提供Clock以及对从设备进行片选(SlaveSelect/ss)来控制多个从设备,SPI协议还规定从设备的Clock由Master设备通过SCK管脚提供给从设备,从设备本身不能产生或控制Clock,没有Clock 则从设备不能正常工作。
2.2 采用同步方式传输数据Master设备会根据将要交换的数据来产生相应的时钟脉冲(ClockPulse),时钟脉冲组成了时钟信号(Clock Signal),时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制着两个SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。
2.3 数据交换(Data Exchanges)SPI设备间的数据传输之所以又被称为数据交换,是因为SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)"或者"接收者(Receiver)"。
在每个Clock周期内,SPI设备都会发送并接收一个bit大小的数据,相当于该设备有一个bit大小的数据被交换了。
一个从设备要想能够接收到Master发过来的控制信号,必须在此之前能够被Master设备进行访问(Access)。
所以,Master设备必须首先通过SS/CSpin对从设备进行片选,把想要访问的从设备选上。
zigbee数据的发送和接收

数据的发送和接收一、数据的发送在ZStack2006的协议栈中,我们只需调用函数AF_DataRequest()即可完成数据的发送。
afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,uint16 cID, uint16 len, uint8 *buf, uint8 *transID, uint8 options,uint8 radius )而我们在使用AF_DataRequest() 函数时只需要了解其参数便可以非常灵活的以各种方式来发送数据。
AF_DataRequest()函数参数说明如下:*dstAddr---------------------发送目的地址、端点地址以及传送模式*srcEP -----------------------源端点cID ---------------------------簇IDlen ---------------------------数据长度*buf -------------------------数据*transID --------------------序列号options ----------------------发送选项radius -----------------------跳数*dstAddr决定了消息发送到那个设备及那个endpoint,而簇ID(cID)决定了设备接收到信息如何处理。
簇可以理解为是一种约定,约定了信息怎么处理。
重要参数说明:1、地址afAddrType_ttypedef struct{union{uint16 shortAddr; //短地址}addr;afAddrMode_taddrMode; //传送模式byteendPoint; //端点号}afAddrType_t;2、端点描述符endPointDesc_ttypedef struct{byteendPoint; //端点号byte*task_id; //那一个任务的端点号SimpleDescriptionFormat_t*simpleDesc;//简单的端点描述afNetworkLatencyReq_tlatencyReq;}endPointDesc_t;3、简单描述符SimpleDescriptionFormat_ttypedef struct{byte EndPoint; //EPuint16 AppProfId; //应用规范IDuint16 AppDeviceId; //特定规范ID 的设备类型byte AppDevVer:4; //特定规范ID 的设备的版本byte Reserved:4; //AF_V1_SUPPORTusesforAppFlags:4.byte AppNumInClusters; //输入簇ID 的个数cId_t *pAppInClusterList; //输入簇ID 的列表byte AppNumOutClusters; //输出簇ID 的个数cId_t *pAppOutClusterList; //输出簇ID 的列表}SimpleDescriptionFormat_t;4、簇ID cIDClusterID--具体应用串ID5、发送选项options发送选项有如下选项#defineAF_FRAGMENTED 0x01#defineAF_ACK_REQUEST 0x10#defineAF_DISCV_ROUTE 0x20#defineAF_EN_SECURITY 0x40#defineAF_SKIP_ROUTING 0x80其中AF_ACK_REQUEST为发送后需要接收方的确认6、半径、条数radius传输跳数或传输半径,默认值为10数据发送模式说明:在协议栈数据发送模式有以下几种:单播、组播、广播和直接发送四种模式。
组播发送和接收的流程

组播发送和接收的流程组播(Multicast)技术是计算机网络中的一种关键技术,它可以让一个发送者同时向多个接收者发送数据,且不需要拆分不同数据包或者重新建立多次连接。
这种技术在网络直播、视频会议、在线教育、IP电话等应用场景中被广泛采用。
下面将对组播发送和接收的流程进行整体梳理,并详细描述每个环节的具体过程。
一、组播发送流程1. 创建组播组:发送者需要先创建一个组播组(Multicast group),这个组就是所有接收者的目的地,组播组的地址是组播地址,如224.0.0.1。
2. 发送数据:发送者发送数据的时候,将数据发送到该组地址(如224.0.0.1)。
数据可以是任何类型的数据,如音视频、文字、图片等等。
3. 选择发送接口:发送者需要选择一个合适的发送接口来发送数据包,这个接口可以是物理网卡、虚拟网卡,或者通过隧道协议发送。
4. 封装数据包:发送者需要将数据封装在数据包中,数据包包括IP头、UDP头和应用层数据,IP头中必须设置TTL字段,防止数据包永远在网络中循环。
5. 选择多播路由:发送者还需要选择一个合适的多播路由(Multicast Router)来推送数据包。
多播路由是一个专门负责多播转发的设备,它必须要支持多播协议(如IGMP),并且能够将数据包从一个接口转发到另一个接口。
6. 发送数据包:发送者将封装好的数据包发送到选择的多播路由。
7. 多播路由转发:多播路由负责转发该数据包到所有接收者。
当多播路由收到一个数据包后,它会根据组播IP地址找到相应的组播组,然后查找IGMP表,确定哪些接口有人加入该组播组,然后将数据包转发到这些接口上。
8. 接收端接收数据:最终,接收者从它们加入的组播组中接收数据。
二、组播接收流程1. 发送IGMP报文:接收者在加入一个组播组之前,需要先发送IGMP(Internet Group Management Protocol)报文,IGMP协议是一个使主机或路由器知晓多播组内成员的协议。
计算机网络中的数据传输与路由

计算机网络中的数据传输与路由计算机网络是现代社会中重要的信息交流和沟通工具。
在网络中,数据传输和路由是核心的组成部分。
本文将详细介绍计算机网络中的数据传输和路由,并分点列出步骤。
1. 数据传输的概念数据传输是指将信息从一台计算机发送到另一台计算机的过程。
在计算机网络中,数据传输通常分为两个阶段:发送端发送数据和接收端接收数据。
数据传输的过程需要借助网络协议来进行控制和管理。
2. 数据传输的步骤(1)发送方划分数据:在数据传输过程中,发送方将要传输的数据划分为较小的单元,称为数据包或数据帧。
这样做的目的是方便传输和控制。
(2)数据封装:发送方通过添加一些附加信息来封装数据包或数据帧。
例如,添加源和目的地址、校验和等信息。
这些附加信息也可以帮助接收方进行数据验证和错误处理。
(3)传输控制:发送方需要根据目的地址选择一条合适的路径将数据传输至接收方。
在传输过程中,发送方需要进行传输控制,如流量控制和拥塞控制,以保证数据可靠地传输。
(4)数据传输:在传输过程中,发送方将数据包或数据帧通过网络传输至接收方。
数据传输可以通过有线或无线方式进行。
(5)数据接收:接收方接收到数据包或数据帧后,进行解封装,提取出真正的数据。
接收方还会进行数据验证,比如校验和计算,以确保数据的完整性。
3. 路由的概念路由是指在计算机网络中确定数据传输路径的过程。
在大型网络中,数据包需要经过多个路由器进行传输,路由器会根据一定的算法来选择合适的路径。
4. 路由的步骤(1)路由表的建立:在路由过程中,每个路由器都会建立一个路由表,记录各个目的地址与对应的下一跳(下一个路由器)之间的关系。
路由表可以手动配置,也可以通过一些路由协议自动学习和更新。
(2)数据包传输:当发送方的数据包到达一个路由器时,路由器会根据自己的路由表来选择下一跳,并将数据包传输给下一个路由器。
这个过程会一直重复,直到数据包到达目的地。
(3)路由选择策略:路由器在选择下一跳时,会考虑多种因素,如路径长度、带宽、拥塞状况等。
串口通信基础,接收,发送数据

串⼝通信基础,接收,发送数据通信接⼝背景知识设备之间通信的⽅式⼀般情况下,设备之间的通信⽅式可以分成并⾏通信和串⾏通信两种。
它们的区别是:串⾏通信的分类1、按照数据传送⽅向,分为:单⼯:数据传输只⽀持数据在⼀个⽅向上传输;半双⼯:允许数据在两个⽅向上传输。
但是,在某⼀时刻,只允许数据在⼀个⽅向上传输,它实际上是⼀种切换⽅向的单⼯通信;它不需要独⽴的接收端和发送端,两者可以合并⼀起使⽤⼀个端⼝。
全双⼯:允许数据同时在两个⽅向上传输。
因此,全双⼯通信是两个单⼯通信⽅式的结合,需要独⽴的接收端和发送端。
2、按照通信⽅式,分为:同步通信:带时钟同步信号传输。
⽐如:SPI,IIC通信接⼝。
异步通信:不带时钟同步信号。
⽐如:UART(通⽤异步收发器),单总线。
在同步通讯中,收发设备上⽅会使⽤⼀根信号线传输信号,在时钟信号的驱动下双⽅进⾏协调,同步数据。
例如,通讯中通常双⽅会统⼀规定在时钟信号的上升沿或者下降沿对数据线进⾏采样。
在异步通讯中不使⽤时钟信号进⾏数据同步,它们直接在数据信号中穿插⼀些⽤于同步的信号位,或者将主题数据进⾏打包,以数据帧的格式传输数据。
通讯中还需要双⽅规约好数据的传输速率(也就是波特率)等,以便更好地同步。
常⽤的波特率有4800bps、9600bps、115200bps等。
在同步通讯中,数据信号所传输的内容绝⼤部分是有效数据,⽽异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率⾼,但是同步通讯双⽅的时钟允许误差⼩,稍稍时钟出错就可能导致数据错乱,异步通讯双⽅的时钟允许误差较⼤。
常见的串⾏通信接⼝STM32串⼝通信基础STM32的串⼝通信接⼝有两种,分别是:UART(通⽤异步收发器)、USART(通⽤同步异步收发器)。
⽽对于⼤容量STM32F10x系列芯⽚,分别有3个USART和2个UART。
UART引脚连接⽅法RXD:数据输⼊引脚,数据接受;TXD:数据发送引脚,数据发送。
对于两个芯⽚之间的连接,两个芯⽚GND共地,同时TXD和RXD交叉连接。
单片机串行口接收和发送数据的过程简述

单片机串行口接收和发送数据的过程简述
串行口接收和发送数据的过程简述
答:在发送过程中,当执行一条将数据写入发送缓冲器SBUF(99H)的指令时,串行口把SBUF中8位数据以fosc/l2的波特率从RXD(P3.0)端输出,发送完毕置中断标志TI=1。
写SBUF指令在S6P1处产生一个正脉冲,在下一个机器周期的S6P2处,数据的最低位输出到RXD(P3.0)脚上;再在下一个机器周期的S3、S4和S5输出移位时钟为低电平时,在S6及下一个机器周期的Sl和S2为高电平,就这样将8位数据由低位至高位一位一位顺序通过RXD线输出。
并在TXD脚上输出fosc/12的移位时钟。
在写SBUF有效后的第10个机器周期的SlPl将发送中断标志TI置位。
接收时,用软件置REN=1(同时,RI=0),即开始接收。
当使SCON中的REN=1(RI=0)时,产生一个正的脉冲,在下一个机器周期的S3P1~S5P2,从TXD(P3.1)脚上输出低电平的移位时钟,在此机器周期的S5P2对P3.0脚采样.并在本机器周期的S6P2通过串行口内的输入移位寄存器将采样值移位接收。
在同一个机器周期的S6P1到下一个机器周期的S2P2,输出移位时钟为高电平。
于是,将数据字节从低位至高位接收下来并装入SBUF。
在启动接收过程(即写SCON,清RI位),将SCON中的RI清0之后的第l0个机器周期的SlPl将RI置位。
这一帧数据接收完毕,可进行下一帧接收。
红外通讯(发送与接收)课件

目录
• 红外通讯概述 • 红外发送模块 • 红外接收模块 • 红外通讯协议 • 红外通讯实例
01
红外通讯概述
红外通讯定义
红外通讯是一种利用 红外线传输数据的通 信方式。
红外通讯具有无需可 见光、安全性高、抗 干扰能力强等优点。
它通过发送和接收红 外信号来实现数据的 传输。
时域抗干扰
采用脉冲压缩、相干检测等技术,提高时间分辨率和抗干扰能力。
空域抗干扰
利用光学天线或反射镜实现信号的定向传输,减少干扰信号的影响。
感谢您的观看
THANKS
03
红外接收模 块
红外接收电路
光电转换
红外接收模块通过光电转换将红 外光信号转换为电信号。
信号放大
转换后的电信号通常比较微弱,需 要进行放大处理。
滤波处理
对放大后的信号进行滤波,以去除 噪声和干扰。
解调与解码方式
解调技术
采用适当的解调技术,如相干解 调或非相干解调,将已调制的信 号还原为原始信号。
红外通讯原理
发送端将数据转换为红外信号, 通过红外发射器发送出去。
红外通讯的传输速率、传输距离 和调制方式等参数取决于具体的 硬件设备。
01
02
红外通讯系统由发送端和接收端 组成。
03
接收端接收到红外信号后,将其 转换为电信号,再经过解码还原 成原始数据。
04
红外通讯应用场景
01
02
03
04
家庭和办公环境
红外通讯技术在工业环境中具有较高的可靠性和稳定性,能 够在较为恶劣的环境下正常工作,并且具有较低的成本和维 护要求。
06
红外通讯发展趋势与挑战
提高传输速率与距离
STM32-实现串口中断接收和发送数据

STM32-实现串⼝中断接收和发送数据⼀、⼯具 1、硬件:STM32L053R8单⽚机(HAL库) 2、编译环境:Atollic TrueSTUDIO for STM32 9.3.0 3、辅助⼯具:STM32CubeMX⼆、单⽚机系统时钟配置 1、系统时钟配置(没有显⽰的默认),这⾥选择的是内部的⾼速时钟(HSI)作为时钟源,系统时钟频率配置到24MHz。
三、串⼝配置 1、选⽤的是串⼝1,模式是异步通讯,波特率为38400,数据位长度为8,⽆校验位,⼀个停⽌位,接收和发送都打开,其它默认。
2、使能串⼝中断四、⽣成⼯程并进⾏完善 1、⼯程⽣成设置 2、完善代码 在配置完串⼝后,要以中断的⽅式接收数据,后⾯新增的接收⼀个字节数据函数主要是为了打开串⼝中断并等待有数据发来,剩下的字节由中断的回调函数控制接收。
/*** @brief USART1 Initialization Function* @param None* @retval None*/static void MX_USART1_UART_Init(void){/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 38400 ;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 */HAL_UART_Receive_IT(&huart1, &r_data, 1);/* USER CODE END USART1_Init 2 */} 当有数据发来,会响应中断接收数据,接收完后会关闭中断然后调⽤⼀个回调函数,如果想接收多个数据,就需要在回调函数中重新开启接收中断,回调函数的内容可以由⽤户⾃⼰添加(该函数名为固定写法不能随意更改)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
显式长度
在长度可变的字段或消息前附加一个长度 字段,指出包含多少个字节。长度字段一 般具有固定的大小:这会限制可以成帧的 28
基于文本的消息编码
将投票消息表示为文本,由于消息中只需 要表示数字和两个指示器,因此可以使用 基本的C语言字符集ASCII。 空字符作为消息的定界符,每个消息的开 头是一个所谓的“魔术字符串”,它允许 接收者快速将消息设别为投票协议的消息, 并且与通过网络达到的随机垃圾消息区分 开。
通信应用软件设计
第五章
发送和接收数据
目标
掌握本机字节顺序以及网络字节顺序的区 别 掌握C语言对齐规则以及由此导致的问题 掌握消息成帧的两种方式:文本字符格式 和数据结构体方式。 掌握案例:一个简单的投票系统
2
概述
任何交换信息的程序都必须就如何编码信 息(表示为一个位序列)达成一致,即发 送信息是以何种格式,接收者必须以同样 的信息格式进行解析。这种关于通过通信 信道交换的信息的形式和含义的协定称为 协议(protocol)。 大多数应用程序协议是依据由字段(field) 序列构成的具体消息定义的。每个字段都 包含一份特定的编码为位序列的信息。应 用程序协议准确指定了发送者如何排列这 3 些序列,以及接收者如何解释或解析它们。
20
字符串和文本
可打印(显示)的字符串是表示信息的最 常用的方式。 C语言的字符集为ASCII码。汉子等多于一 个字节进行编码的字符如何表示?C99扩 展标准定义了一种wchar_t(宽字符)类型, 用于存储可能为每个符号使用多个字节的 字符集中的字符。 函数wcstombs和mbstowcs用于支持字节 顺序与wchar_t的数组之间进行相互转换。
12
在流中包装TCP套接字(2)
13
结构覆盖:对齐与填充(1)
构造包含二进制数据(即多字节整数)的 消息的最常用的方法是把C结构覆盖在一块 内存区域上,并直接分配给结构的字段。 例如地址信息结构如下: struct addressInfo { uint16_t streetAddress; //街道编号 int16_t aptNumber; //公寓编号 uint32_t postalCode; //邮编 14 } addrInfo;
7
字节排序(1)
对于需要多个字节进行编码的整数,必须 回答以哪种顺序发送字节的问题。 例如:123456787654321L的十六机制为 0x0000704885F926B1
00 00 70 48 85 F9 26 B1 大端 小端
8
字节排序(2)
网络字节顺序:使用大端字节顺序 本机字节顺序:可能是大端也可能是小端 顺序存储。 本机字节顺序与网络字节顺序之间转换函 数:htons htonl ntohs ntohl
结构覆盖:对齐与填充(2)
发送结构体信息 (假设结构体已经赋值)
addrInfo.streetAddress = htons( addrInfo.streetAddress ) addrInfo.aptNumber = htons( addrInfo. aptNumber ) addrInfo.postalCode = htonl( addrInfo. postalCode ) if(send(sock, &addrinfo, sizeof(addrinfo),0) != sizeof(addrinfo)) ….
客户发送一条请求(request)消息给服务器, 该消息包含候选人ID,请求类型,是否响应,投 票数。
23
客户端程序
步骤
建立TCP连接 将结构体VoteInfo型数据编码为发送字节序列
成帧并发送数据
接收返回响应信息 解码返回信息并打印
24
服务器程序
步骤
建立侦听套接字 反复接受连接和处理信息 等待连接 在流中包装套接字 接收并处理消息,直至连接关闭
4
整数的大小(2)
通过TCP连接发送32位整数,在不同的平 台上可能存在不同的解释,可以解释为int, 也可以解释为long。 C99语言标准规范以一组可选类型的形式 提供了一种解决方案:int8_t int16_t int32_t int64_t。这样可以有效地解决整数 存储位数不一致的问题。
15
结构覆盖:对齐与填充(3)
使用结构体来接收数据
16
结构覆盖:对齐与填充(4)
一个15字节的消息结构体, sizeof(integerMessage)为16字节,而不是 15字节。这是因为C语言特定的对齐规则 造成的。
17
C语言的对齐规则
数据结构是最大限度地对齐,即任何一个 结构类型的变量的地址都可以被其最大的 本机整型字段除尽。 类型为多字节的整数类型要与它们的大小 对齐,即int32_t类型的变量开始地址总是 可以被4除尽,而一个uint16_t的开始地址 则保证可以被2除尽。
整数的大小(1)
在某种意义上,所有类型的信息最终都将 被编码为固定大小的整数。 C语言定义的几种整型:char short int long C语言没有指定这些整型的存储位数的准确 大小,而是把它留给实现来完成。因此整 型存储位数大小可能因平台而异。 计算整型存储位数的大小是:sizeof,以字 节为单位,例如: sizeof(int)。
5
c99
c99是在c89的基础上发展起来的,增加了 基本数据类型,关键字和一些系统函数等。 其实在初学阶段C89(ANSI C)和C99的 区别是不易察觉的,所以不必太在意这个。 C99有一部分是对于大字符集的优化,还 加入了一些数据库函数,是C89之后的标 准,我们用的C是C89标准的,C++是C89 编写的,目前的C99标准其实在以前的编 译器中就或多或少的支持了,目前完全支 6 持的有这些:GCC、Borland C++等。
21
位操作:编码布尔值
位图(bitmap)是编码布尔信息的非常简 洁的方式。位图的思想是:整数类型的每 一个位都可以编码一个布尔值(0或1)。 掩码(mask)是把一个或多个特定的位设 置为1并且清除所有其他的位。 位运算符 & | >> << ~
22
构造、成帧和解析消息
案例:一个简单的“投票”协议
25
成帧
成帧指的是允许接收者定位消息(或其一 部分)的边界的普遍问题。 两种常规技术可以让接收者明确地查找消 息的末尾:
基于定界符 显式长度
26
基于定界符
通过唯一标记指示消息的末尾。 基于定界符的方法的一个特例是:发送者 发送消息后关闭连接,接收者在读取消息 的最后一个字节后,会接收到一个流结束 标志。 基于定界符的方法通常用于编码为文本的 消息。 基于定界符方法的缺点是:消息自身绝对 不能包含定界符。或者采用转义符的方式, 27 但这将导致发送者和接收者必须扫描消息
18
隐式字节填充
如果在oneByte字段与twoBytes字段之间插 入一个字节的填充,那么就满足了字节对 齐规则。 由编译器添加为填充的字节内容是未定义 的。发送者以16字节发送,而接收者以15 字节接收,那么很可能出现不正确的结果。
19
显式字节填充
这个结构在内存中的布置方式与原来申明 的integerMessage完全一样,只不过程序 员现在可以控制和访问填充字节的内容。
9
符号性与符号扩展
负数在C语言中采用补码表示。 负数值赋给无符号的变量时将使负数的符 号位变量值的一部分。 在计算表达式的值时,首先要将变量的值 加宽到本机(int)大小。例如 char a, b ; sizeof(a+b) 的值为4
10
手工编码整数
程序BruteForceCoding.c中的 EncodeIntBigEndian使用大端表示法把任 何给定的基本整数值作为指定字节数的序 列存放在内存中的指定位置。 DecodeIntBigEndian方法用于处理将给定 长度的字节序列解码为64位的整数,并将 其解释为大端序列。 BruteForceCoding.c
29
二进制消息编码(1)
使用数据结构体作为消息的传输格式。
30
二进制消息编码(2)
31
11
在流中包装TCP套接字(1)
编码多个字节的整数可以使用流的方式在 TCP套接字上传输。 FILE工具流:通过fdopen()调用把一个或 多个FILE流与套接字描述符相关联。
FILE *fdopen(int socketdes, const char *mode); int fclose(FILE *stream); int fflush(FILE *stream); frwrite(….) fread(…)