㈠ 如何用串口发送数据包
当然可以。串口助手里设置好就行。比如这样设置:波特率9600,数据位8,停止位1,校验为:奇校验、偶校验、标志位....任选其一。停止位:1.
单片机里按同样设置就行。
11位是一个字节,加了开始位,停止位,还有一个TB8,多机通信地址和数据通信区分位,不是一帧,确切的说是一个字节
楼主概念错误。串口通讯里叫帧,是指完成一次完整的数据传送。一帧里可以包含多个字节(同步通讯),也可以包含一个字节。比如包含了开始位,停止位,还有一个多机通信地址和数据通信区分位TB8的一次异步发送叫一帧。其中有效的信息是一个字节。
单片机工作在方式3,波特率9600,一个开始位,一个停止位,一个TB8区分地址和数据标志位,没有校验位的,校验用的是CRC16的,在串口调试助手里的设置:波特率9600,一个开始位,一个停止位,校验方式设为“无”,为什么没有数据返回呢?在系统里就有数据返回,有人说串口调试助手只能调试8位的数据,而单片机工作在方式3,增加一个TB8位,总共是九位数据,所以串口调试助手调试不了,是这样吗?
你校验方式设置错了啊!咋能设置成
无
呢?
你是要看单片机有没有回传数据对吧?先看发送的是地址还是数据,再看你的SM2位咋个弄的。总之确信单片机程序没错啦,也就是确信有回传数据了,把校验方式设置成:mark.再看。
㈡ 如何将串口二得到的数据,通过串口一发出去
首先,获取单片机和串口屏的通信协议;
其次,在PC中编写串口通信软件,分别控制两个设备即可;
调试的时候,可以先用现有的串口助手类软件如串口调试助手,或者自定义协议功能的通信软件如格西烽火,测试和验证你定义的协议。
㈢ 如何向串口发送数据,并接收串口发来的数据
您好,设备端和控制端连接好,控制端有接收发送数据的软件,那么就可以直接接收发送数据。如果有协议限制,匹配相应的协议即可。
㈣ STM32初学者求助!串口问题:如何用串口2接收数据,然后再由串口1发送出去
最简单就建个数组当缓冲区,串口2中断接收,串口1判断缓冲区只要有数据就发送,发送时计数器或指针移位的过程最好屏蔽中断。
㈤ STC12C5A60S2单片机的串口2发送数据问题
在PUDN 上找一个程序吧,很多这款单片机的,也有串口2的程序
㈥ 如何将串口二得到的数据,通过串口一发出去
void USART2_IRQHandler(void)
{
u8 Res;
int i;
if(USART_GetITStatus(USART2,USART_IT_RXNE))
{
Res =USART_ReceiveData(USART2);
USART_SendData(USART1,Res);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
}
}
你可以试试看这个代码
㈦ 串口发送与接收数据
使用RS-485串口进行通讯。
1.定义串口接收数据的缓冲区,最大可以保存64个字节 u8 RS485_RX_BUF1[64];
2.定义接收发送数据的长度 u8 RS485_RX_CNT;
3.发送数据的函数一般有两个printf和 USART_SendData,这里主要说USART_SendData的使用。printf实现的是格式化字符串,字符串比较有优势。
USART_SendData传递单个字符和指令。
4.给发送方定义一个标记位 u32 flags_send1; flags_send1
5.要发送的事件很多定义一个枚举类型的数据,将所有要发送的事件放入枚举类型数据中。
枚举类型数据将第一个定为1,其他的数据依次加1.
6.定义一个发送事件函数SendCmd(u8 cmd)
定义
7.假设要传递E_CKEYDN_INUSE1事件,要实现事件的传递,就应该将事件做参数传入SendCmd(u8 cmd)函数
此时flags_send1 |= EBIT(9)=;由第四点知道flags_send1是一个32位的无符号整型数据。所以 flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111
8.(1)UARTSend1()函数
此时的flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111;
sb[2] = (flags_send1 >> 0) & 0xff = 1111 1111;
sb[3] = (flags_send1 >> 8) & 0xff = 0000 0001;
sb[4] = (flags_send1 >> 16) & 0xff = 0000 0000;
sb[5] = (flags_send1 >> 24) & 0xff = 0000 0000;
(2)checksum()函数
d0=(senddata >> 0) & 0xff=0000 0001 1111 1111;
d1=(senddata >> 8) & 0xff=0000 0001 & 0xff=0000 0000 0000 0001;
d2=(senddata >> 16) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
d3=(senddata >> 24) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
sum=0000 0010 0000 0000;
~sum=1111 1101 1111 1111;
sb[6] = (sum >> 0) &0xff = 1111 1111 & 0xff = 1111 1111 ;
sb[7] = (sum >> 8) &0xff = 1111 1101;
(3)
为什么定义sb[8]的前两位是0x55,0xaa?
0xaa是1010 1010,0x55是0101 0101在通讯编码原理中,应该避免过多的重复0或者1,因为当传输变成一个长0/1时,一个脉冲干扰就会将数据截断,增加误码的概率。若通讯机不能接受10101010或者01010101,那么就是线路出现问题。这是一个判断线路状态的手段。
9.串口1接收数据
(1)通过UARTRead1()函数实现
receive += (RS485_RX_BUF1[2] << 0) = 0000 0000 0000 0000 0000 0000 1111 1111; ;
receive += (RS485_RX_BUF1[3] << 8) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[4] << 16) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[5] << 24) = 0000 0000 0000 0000 0000 0001 1111 1111
(2)将receive传入checksum(u32 senddata)函数中
d0= 0000 0000 1111 1111;
d1=0000 0000 0000 0001
d2= 0000 0000 0000 0000
d3=0000 0000 0000 0000
sum=0000 0001 0000 0000
~sum = 1111 1110 1111 1111
(3)定义接收数据标记位是 u32 flags_receive1;
通过判断RS485_RX_BUF1[6] 、RS485_RX_BUF1是否等于 ((sum >> 0) & 0xff)、((sum >> 8) & 0xff))来判断读入的数据是不是正确的。
RS485_RX_BUF2[6] ==1111 1111
RS485_RX_BUF2[7] == 1111 1110
正确时
接收到的数据是flags_receive1 = receive= 0000 0000 0000 0000 0000 0001 1111 1111;
不正确时 flags_receive1 |= EBIT(E_ERROR); 接收数据标记位置为错误位。