成都网站建设工资,酷家乐在线3d云设计平台,重庆市建设工程管理协会网站,思淘网站建设1. 什么是通信
通信#xff0c;指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递#xff0c;从广义上指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法#xff0c;任意媒质#xff0c;将信息从某方准确安全地传送到另方。通信双方如果想正确传输…1. 什么是通信
通信指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递从广义上指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法任意媒质将信息从某方准确安全地传送到另方。通信双方如果想正确传输数据就需要约定不违背的协议。 通信在不同的环境下有不同的解释在出现电波传递通信后通信(Communication)被单一解释为信息的传递是指由一地向另一地进行信息的传输与交换其目的是传输消息。
然而通信是在人类实践过程中随着社会生产力的发展对传递消息的要求不断提升使得人类文明不断进步。
在各种各样的通信方式中利用“电”来传递消息的通信方法称为电信(Telecommunication)这种通信具有迅速、准确、可靠等特点且几乎不受时间、地点、空间、距离的限制因而得到了飞速发展和广泛应用
在现今因电波的快捷性使得从远古人类物质交换过程中就结合文化交流与实体经济不断积累进步的实物性通信邮政通信被人类理解为制约经济发展的阻碍。
在古代人类通过驿站、飞鸽传书、烽火报警、符号、身体语言、眼神、触碰等方式进行信息传递。
在现代科学水平的飞速发展相继出现了无线电、固定电话、移动电话、互联网甚至视频电话等各种通信方式。通信技术拉近了人与人之间的距离提高了经济的效率深刻地改变了人类的生活方式和社会面貌。
1. 分类
1 按传输媒质分类
有线通信是指传输媒质为导线、电缆、光缆、波导、纳米材料等形式的通信其特点是媒质能看得见摸得着(明线通信、电缆通信、光缆通信、光纤光缆通信)。
无线通信是指传输媒质看不见、摸不着(如电磁波)的一种通信形式 [2] 。
(微波通信、短波通信、移动通信、卫星通信、 散射通信)。
2 按信道中传输的信号分类
模拟信号凡信号的某一参量(如连续波的振幅、频率、相位脉冲波的振幅、宽度、位置等)可以取无限多个数值且直接与消息相对应的模拟信号有时也称连续信号。 这个连续是指信号的某一参量可以连续变化。
数字信号凡信号的某一参量只能取有限个数值并且常常不直接与消息相对应的也称离散信号 [1] 。
3 按工作频段分类
长波通信。
中波通信。
短波通信。
微波通信。
4 按调制方式分类
基带传输是指信号没有经过调制而直接送到信道中去传输
的通信方式。
频带传输是指信号经过调制后再送到信道中传输接收端
有相应解调措施的通信方式。
5按通信双方的分工及数据传输方向分类。
对于点对点之间的通信按消息传送的方向通信方式可分为单工通信、半双工通信及全双工通信三种。
所谓单工通信是指消息只能单方向进行传输的一种通信工作方式。单工通信的例子很多如广播、遥控、无线寻呼等。这里信号消息只从广播发射台、遥控器和无线寻呼中心分别传到收音机、遥控对象和BP 机上。
所谓半双工通信方式是指通信双方都能收发消息但不能同时进行收和发的工作方式。对讲机、收发报机等都是这种通信方式。
所谓全双工通信是指通信双方可同时进行双向传输消息的工作方式。在这种方式下双方都可同时进行收发消息。很明显全双工通信的信道必须是双向信道。生活中全双工通信的例子非常多如普通电话、手机等。
2. 组成
实现信息传递所需的一切技术设备和传输媒质的合称为通信系统。
信源消息的产生地其作用是把各种消息转换成原始电信号称之为消息信号或基带信号。电话机、电视摄像机和电传机、计算机等各种数字终端设备就是信源。
发送设备将信源和信道匹配起来即将信源产生的消息信号变换为适合在信道中搬移的场合调制是最常见的变换方式。对需要频谱搬移场合调制是最常见的变换方式。对数字通信系统来说发送设备常常又分为信源编码与信道编码。
信道传输信号的物理媒质。
噪声源是通信系统中各种设备以及信道中所固有的为了分析方便把噪声源视为各处噪声的集中表现而抽象加入到信道。
接收设备完成发送设备的反变换即进行解调、译码、解码等等。它的任务是从带有干扰的接收信号中正确恢复出相应的原始基带信号来。
信宿传输信息的归宿点其作用是将复原的原始信号转换成相应的信息 2. 通信的传输方式。 现在普遍双工比较多。
3. 通信中的并行串行 现在普遍串行比较多。 4. 通信中的同步异步。 5. USART异步通信 的数据帧格式。
1.接收方怎么知道你什么时候发送。当发送完怎么知道你发送结束。所以在发送一个字节时会先发送一个起始位。在空闲的时候因为是高电平。当发送起始位是0当接收方收到0就知道你要发送数据了就准备好接收数据。当发完一个字节时。这时又会发送一个停止位1。当接收方接收到停止位1就知道你发送完了。发送一个字节需要发送10个位。起始位(一位 一个字节八位 起始位一位。如图奇偶校验位可以先不考虑。
2. 具体发送方多久发送一个bit呢
从而引出波特率。如果波特率是9600。那么1/9600s传输1bit。
1s传输9600bit。但对于接收方以多大的速度去接收呢。如果速度慢会丢bit。一般采样频率是
传输频率的16倍。这样才能保证稳定不丢。
如果单片机是发送方。笔记本电脑是接收方。我们不需要考虑接收问题。笔记本电脑硬件会自己处理。但是显示接收的上位机软件要配置跟下位机一样波特率停止位数据位是否有校验位。
如果单片机是接收方。笔记本电脑是发送方。需要考虑采样频率的问题。
3. 具体波特率怎么产生呢
在库函数里设置波特率参数。就可以产生。有相应的硬件电路。我们不需要管。如果像有些51单片机是没有波特率产生电路的。需要用一个定时器配置来产生。 对于异步通信字节与字节传输是可以间隔传输的。接收方接收到起始就知道有数据来。接收到停止位知道一个字节接收完毕。等一下字节也是同样方式。 6. USART的框图
对于收发就看圈的部分即可 7. dome 串口发送数据
使用串口0 RX:PA9 TXPA10 串口初始化步骤(这个dome没用中断) usart_comm.h
#ifndef USART_COMM_H
#define USART_COMM_H
/**
brief: 串口处理的模块
*/#include gd32f10x.hvoid usart0_init(uint32_t baudval);void usart0_send_byte(uint8_t ch);void usart0_send_string(uint8_t *ch);#endifusart_cmm.c
#include usart_comm.h/**
*brief: usart0的初始化
*param baudval 波特率
*retval NONE
*/
void usart0_init(uint32_t baudval){/* 初始化时钟和对应的io口 */rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_USART0);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); /* TX 推挽复用 */gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); /* RX 浮空输入 */// 配置usart0的工作参数usart_deinit(USART0); /* 重置初始化 */usart_baudrate_set(USART0, baudval); //波特率usart_parity_config(USART0, USART_PM_NONE); //无奇偶校验usart_word_length_set(USART0, USART_WL_8BIT); //bit长度usart_stop_bit_set(USART0, USART_STB_1BIT); //停止位usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); //使能发送usart_receive_config(USART0, USART_RECEIVE_ENABLE); //使能接收usart_enable(USART0); /* 使能串口 */
}/**
*brief: usart0发送一个字节
*param ch待发送字节
*retval NONE
*/
void usart0_send_byte(uint8_t ch){usart_data_transmit(USART0, ch);while(usart_flag_get(USART0, USART_FLAG_TBE)RESET); /* 等待发送完成 */
}/**
*brief: usart0发送字符串
*param ch待发送字符串指针
*retval NONE
*/
void usart0_send_string(uint8_t *ch){uint32_t k 0;while(*(chk) ! \0){usart0_send_byte(*(chk));k;}
}main.c
#include systick.h
#include usart_comm.hint main(){systick_config();usart0_init(9600);while(1){usart0_send_string((uint8_t *)hello UART.\n); //自动会填充字符串结束符\0delay_1ms(1000); //等待1s}
}结果 8. dome 串口发送接收数据中断
通过上位机发指令来控制下位机的LED,继电器的操作。
继电器硬件图 J1接到PB15. 控制PB15来控制继电器是否工作。
LED硬件图 具体上下位机的协议规定
一帧有5个字节帧头0xFF,设备ID,设备号设备指令帧尾0x00. relay_ctrl.h(继电器
#ifndef RELAY_CTRL_H
#define RELAY_CTRL_H#include gd32f10x.h//定义继电器序号的宏
#define RELAY_1 0x01void relay_init(void);void relay_connect(uint8_t relay_num);
void relay_disconnect(uint8_t relay_num);#endif relay_ctrl.c(继电器
#include relay_ctrl.h// 继电器控制io口的初始化
void relay_init(void){rcu_periph_clock_enable(RCU_GPIOB);gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);//默认让继电器断开relay_disconnect(RELAY_1);
}// 控制继电器吸合
void relay_connect(uint8_t relay_num){switch(relay_num){case RELAY_1:gpio_bit_set(GPIOB, GPIO_PIN_15);break;default:break;}
}// 控制继电器断开
void relay_disconnect(uint8_t relay_num){switch(relay_num){case RELAY_1:gpio_bit_reset(GPIOB, GPIO_PIN_15);break;default:break;}
}led_ctrl.h(LED)
#ifndef LED_CTRL_H
#define LED_CTRL_H#include gd32f10x.h//LED序号的宏定义
#define LED_1 0x01
#define LED_2 0x02void led_init(void);void led_open(uint8_t led_num); //led点亮
void led_close(uint8_t led_num); //led熄灭#endif led_ctrl.c(LED)
#include led_ctrl.hvoid led_init(void){rcu_periph_clock_enable(RCU_GPIOB);gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1);led_close(LED_1);led_close(LED_2);}//led点亮
void led_open(uint8_t led_num){switch(led_num){case LED_1:gpio_bit_set(GPIOB, GPIO_PIN_0);break;case LED_2:gpio_bit_set(GPIOB, GPIO_PIN_1);break;default:break;}
}//led熄灭
void led_close(uint8_t led_num){switch(led_num){case LED_1:gpio_bit_reset(GPIOB, GPIO_PIN_0);break;case LED_2:gpio_bit_reset(GPIOB, GPIO_PIN_1);break;default:break;}
}usart_comm.h(串口
#ifndef USART_COMM_H
#define USART_COMM_H
/**
brief: 串口处理的模块
*/#include gd32f10x.h// 定义数据帧的宏
#define HEX_HEAD 0xFF
#define HEX_TAIL 0x00
#define LED_ID 0x01
#define RELAY_ID 0x02void usart0_init(uint32_t baudval);void usart0_send_byte(uint8_t ch);void usart0_send_string(uint8_t *ch);void deal_rec_buff(void); // 串口通信协议hex数据帧缓存处理函数#endifusart_comm.c(串口
#include usart_comm.h
#include led_ctrl.h
#include relay_ctrl.huint8_t recv_buff[5]; /* 保存结束的数据 */
uint8_t recv_buff_len 0;/**
*brief: usart0的初始化
*param baudval 波特率
*retval NONE
*/
void usart0_init(uint32_t baudval){/* 初始化时钟和对应的io口 */rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_USART0);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); /* TX 推挽复用 */gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); /* RX 浮空输入 */// 配置usart0的工作参数usart_deinit(USART0);usart_baudrate_set(USART0, baudval); //波特率usart_parity_config(USART0, USART_PM_NONE); //无奇偶校验usart_word_length_set(USART0, USART_WL_8BIT); //bit长度usart_stop_bit_set(USART0, USART_STB_1BIT); //停止位usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); //使能发送usart_receive_config(USART0, USART_RECEIVE_ENABLE); //使能接收usart_enable(USART0); /* 使能串口 */// 使能usart0的中断usart_interrupt_enable(USART0, USART_INT_RBNE);/* 中断优先级 */nvic_irq_enable(USART0_IRQn, 2U, 2U);usart0_send_string((uint8_t *)usart0 opened succeed.);}/**
*brief: usart0发送一个字节
*param ch待发送字节
*retval NONE
*/
void usart0_send_byte(uint8_t ch){usart_data_transmit(USART0, ch);while(usart_flag_get(USART0, USART_FLAG_TBE)RESET); /* 等待发送完成 */
}/**
*brief: usart0发送字符串
*param ch待发送字符串指针
*retval NONE
*/
void usart0_send_string(uint8_t *ch){uint32_t k 0;while(*(chk) ! \0){usart0_send_byte(*(chk));k;}
}// USART0的中断响应函数
void USART0_IRQHandler(void){uint8_t temp;if(SET usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);temp usart_data_receive(USART0);if(temp HEX_HEAD){ //数据帧帧头recv_buff_len 0;recv_buff[recv_buff_len] temp;recv_buff_len; }else if(temp HEX_TAIL){ //数据帧帧尾if(recv_buff_len 4){recv_buff[recv_buff_len] temp;deal_rec_buff();}else{usart0_send_string((uint8_t *)error);}}else{if(recv_buff_len 0 recv_buff_len 4){recv_buff[recv_buff_len] temp;recv_buff_len;}else{usart0_send_string((uint8_t *)error);}}}
}// 串口通信协议hex数据帧缓存处理函数
void deal_rec_buff(void){switch(recv_buff[1]){case LED_ID: //LED的控制if(recv_buff[3] 0x01){led_open(recv_buff[2]);}else if(recv_buff[3] 0x02){led_close(recv_buff[2]);}break;case RELAY_ID: //继电器的控制if(recv_buff[3] 0x01){relay_connect(recv_buff[2]);}else if(recv_buff[3] 0x02){relay_disconnect(recv_buff[2]);}break;default: //出错usart0_send_string((uint8_t *)error);break;}
}main.c
#include systick.h
#include usart_comm.h
#include led_ctrl.h
#include relay_ctrl.hint main(){systick_config();usart0_init(9600); /* 波特率9600 */led_init();relay_init();while(1){}
}