单片机与串口助手通信探究及求解,急急急!...
时间:10-02
整理:3721RD
点击:
以前也想过关于单片机与上位机串口助手通信时是用什么格式传输数据的,但是一直没有深入探索,这两天一直迷惑,决心探究一番,我通过单片机与上位机串口助手进行通信,所做实验如下,上位机显示16进制选项勾上。可是还有点迷惑。
那就是单片机发送字符串和数据时是怎么样发送以及串口助手怎么处理的。
1、通过单片机向上位机发送8位数据35(SBUF=35;);上位机接收到数据0x23;
2、通过单片机向上位机发送16进制数据0x35(SBUF=0X35;);上位机接收到数据0x35;
3、通过单片机向上位机发送字符串"35"(
str[0] = '3';str[1] = '5'; ISendStr(str);
void ISendStr ( char *str)
{
while (1)
{
if (*str == '\0') break; // 结束字符
PC_DispChar(*str++);
}
}
void PC_DispChar (uint8 chr)
{
// UART0_SendByte(0xff); // 起始字符
// UART0_SendByte(x);
// UART0_SendByte(y);
UART0_SendByte(chr);
// UART0_SendByte(color);
}
)
上位机接收到数据35;
通过上述三个实验得知,如果发送字符串则上位机直接显示字符串,如果发送十六进制数字,上位机直接显示0x形式的十六进制数字,如果发送十进制数字则上位机显示0x形式数字,到底数据是怎么进行传输和显示的呢。我始终想不明白,在网上找相关资料。
首先找到的是
这是一位网友发的单片机与单片机进行通信的时候遇到的困惑以及解答,这里面解答了单片机是如何发送十进制35的,
然后我又看了另一篇文章labview串口通信讲解,
在这篇文章提到“
用过单片机的都知道,实际所有的串口通讯从本质上说,都是二进制的,只不过接收方面如何判定数据的问题.
比如发送的是33(HEX),接收方面可以解释成数字1,(字符串型),或者是数字33.
用过C的人知道,字符串实际和U8数组是等价的.“
所以我对我的三个实验做了猜想:
1、直接发送35时,单片机首先转换成16进制0x23然后按照第一篇文章那里提到的一样传输。
2、发送0x35时同上。
3、发送字符串时,由于字符串是一个一个字符发送的,就是把每个字符对应的ascii进行传输。
4、上位机串口助手在进行接收信息时,根据第一篇文章提到的那样先接收从左边数的位然后接收右边的位。不同的是,串口助手是直接从左到右进行组合。
5、如果上述想法成立,那么接收0x35时能显示0x35中的0x,而接受”35“时没有显示0x;上位机软件是怎么知道传输的是十六进制数还是字符串,假如单片机直接把0x35中的0x直接转换成ascii进行传输我就能理解上位机的这种显示,可是如果单片机是这样传输的,那单片机与单片机之间进行通信又没办法解释了,因为从图一和图二中的解释看来说并没有提到对0x进行传输和处理。 求解答?
那就是单片机发送字符串和数据时是怎么样发送以及串口助手怎么处理的。
1、通过单片机向上位机发送8位数据35(SBUF=35;);上位机接收到数据0x23;
2、通过单片机向上位机发送16进制数据0x35(SBUF=0X35;);上位机接收到数据0x35;
3、通过单片机向上位机发送字符串"35"(
str[0] = '3';str[1] = '5'; ISendStr(str);
void ISendStr ( char *str)
{
while (1)
{
if (*str == '\0') break; // 结束字符
PC_DispChar(*str++);
}
}
void PC_DispChar (uint8 chr)
{
// UART0_SendByte(0xff); // 起始字符
// UART0_SendByte(x);
// UART0_SendByte(y);
UART0_SendByte(chr);
// UART0_SendByte(color);
}
)
上位机接收到数据35;
通过上述三个实验得知,如果发送字符串则上位机直接显示字符串,如果发送十六进制数字,上位机直接显示0x形式的十六进制数字,如果发送十进制数字则上位机显示0x形式数字,到底数据是怎么进行传输和显示的呢。我始终想不明白,在网上找相关资料。
首先找到的是
这是一位网友发的单片机与单片机进行通信的时候遇到的困惑以及解答,这里面解答了单片机是如何发送十进制35的,
然后我又看了另一篇文章labview串口通信讲解,
在这篇文章提到“
用过单片机的都知道,实际所有的串口通讯从本质上说,都是二进制的,只不过接收方面如何判定数据的问题.
比如发送的是33(HEX),接收方面可以解释成数字1,(字符串型),或者是数字33.
用过C的人知道,字符串实际和U8数组是等价的.“
所以我对我的三个实验做了猜想:
1、直接发送35时,单片机首先转换成16进制0x23然后按照第一篇文章那里提到的一样传输。
2、发送0x35时同上。
3、发送字符串时,由于字符串是一个一个字符发送的,就是把每个字符对应的ascii进行传输。
4、上位机串口助手在进行接收信息时,根据第一篇文章提到的那样先接收从左边数的位然后接收右边的位。不同的是,串口助手是直接从左到右进行组合。
5、如果上述想法成立,那么接收0x35时能显示0x35中的0x,而接受”35“时没有显示0x;上位机软件是怎么知道传输的是十六进制数还是字符串,假如单片机直接把0x35中的0x直接转换成ascii进行传输我就能理解上位机的这种显示,可是如果单片机是这样传输的,那单片机与单片机之间进行通信又没办法解释了,因为从图一和图二中的解释看来说并没有提到对0x进行传输和处理。 求解答?
void UART0_SendByte (uint8 data)
{
U0THR = data;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}
上面却的函数在这