野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9962|回复: 24

这个是什么原因啊

[复制链接]
发表于 2018-4-8 14:59:17 | 显示全部楼层 |阅读模式
我想做的是在别人给我发送的一串数据中,取出前面八位,但是现在,但是我现在用串口调试的时候,现实的如串口工具,都是0
2222.png
QQ截图1111.png
回复

使用道具 举报

发表于 2018-4-8 15:03:37 | 显示全部楼层
话说和0xff00与过后低八位不都是0了吗。。。。。。。first当然也全是0了啊要高八位应该右移啊,不是左移
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-8 15:15:33 | 显示全部楼层
非谢家之宝树 发表于 2018-4-8 15:03
话说和0xff00与过后低八位不都是0了吗。。。。。。。first当然也全是0了啊要高八位应该右移啊,不是左移

我试过了,也还是不对,就跟我程序一样,最终输出的也还是0,现在都快被搞懵了
111111.png
回复 支持 反对

使用道具 举报

发表于 2018-4-8 15:28:09 | 显示全部楼层
你的数据位是八位,只有低八位有效啊,都变成0了。。。。。16进制 0xff 也只有八位啊
回复 支持 反对

使用道具 举报

发表于 2018-4-8 15:29:02 | 显示全部楼层
本帖最后由 非谢家之宝树 于 2018-4-8 15:31 编辑

你的意思是只要第一个字节的数据吧?uint16完全没有意义啊,读取第一个字节,然后忽略第二个字节的就好咯。。。。
回复 支持 反对

使用道具 举报

发表于 2018-4-8 15:33:44 | 显示全部楼层
话说这串口软件支持把二进制转成16进制发送?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-8 15:42:48 | 显示全部楼层
非谢家之宝树 发表于 2018-4-8 15:33
话说这串口软件支持把二进制转成16进制发送?

可以啊,你选择的就是十六进制发送
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-8 17:27:11 | 显示全部楼层
非谢家之宝树 发表于 2018-4-8 15:28
你的数据位是八位,只有低八位有效啊,都变成0了。。。。。16进制 0xff 也只有八位啊

我知道原因了,但是我不知道怎么解决
因为串口进入中断后,收或者发都是一个字节,所以与0xff00相与的时候都成了0.
我现在想要接受好多个字节的数据(一串数据),我需要对第一个字节的数据和最后一个字节的数据进行判断,我应该怎么做呀?
回复 支持 反对

使用道具 举报

发表于 2018-4-8 17:30:14 | 显示全部楼层
小曹 发表于 2018-4-8 17:27
我知道原因了,但是我不知道怎么解决
因为串口进入中断后,收或者发都是一个字节,所以与0xff00相与的时 ...

用数组先存起来咯
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-8 17:33:54 | 显示全部楼层

你说的意思是,没进一次中断都将数据存进数组?
但是,我的一串数据会一个字节一个字节的进入中断,直到发送接收完成,那我怎么用数组存呀?
回复 支持 反对

使用道具 举报

发表于 2018-4-9 08:11:52 | 显示全部楼层
小曹 发表于 2018-4-8 17:33
你说的意思是,没进一次中断都将数据存进数组?
但是,我的一串数据会一个字节一个字节的进入中断,直到 ...

数组用全局咯,或者扔指针(这个没试过),记得例程里面好像有接受多个字节的例程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 15:37:34 | 显示全部楼层
非谢家之宝树 发表于 2018-4-9 08:11
数组用全局咯,或者扔指针(这个没试过),记得例程里面好像有接受多个字节的例程

有例程吗?给我一个,我才接触这个没有多长时间,不懂的太多了,希望大家帮忙一下
回复 支持 反对

使用道具 举报

发表于 2018-4-25 21:34:18 | 显示全部楼层
本帖最后由 非谢家之宝树 于 2018-4-25 21:35 编辑

这是我自己参考网上的写的
  1. char DEBUG_RecivedDate[DEBUG_DATA_LENGTH];        //接收数据数组
  2. uint8_t DEBUG_RecivedValue = 0;        //接收数据字节数
  3. uint8_t DEBUG_ReciveEndFlag = 0;        //接收完成状态

  4. 这是中断函数
  5. void USART1_IRQHandler(void)
  6. {
  7.         if (USART_GetFlagStatus(DEBUG_USART1, USART_IT_RXNE) != RESET) {        //如果接受到数据(产生RXNE中断)
  8.                 DEBUG_RecivedDate[DEBUG_RecivedValue] = USART_ReceiveData(DEBUG_USART1);        //把数据写入数组
  9.         }
  10.         if (DEBUG_RecivedDate[DEBUG_RecivedValue] == '\n')        //根据\n判断是不是发送结束
  11.         //if (USART_GetFlagStatus(DEBUG_USART1, USART_IT_IDLE) != RESET)        //测试用无效
  12.         {
  13.                 //USART_ClearITPendingBit(DEBUG_USART1, USART_IT_IDLE);        //清除IDLE标志位,没卵用
  14.                 DEBUG_RecivedDate[DEBUG_RecivedValue + 1] = '\0';        //在接受后在数组的末尾加上字符串结束符号\0
  15.                 DEBUG_RecivedValue = 0;        //数组位置重置
  16.                 DEBUG_ReciveEndFlag = 1;        //数据接收完成标志置位
  17.         }
  18.         else
  19.         {
  20.                 DEBUG_RecivedValue++;        //数组下移
  21.                 if (DEBUG_RecivedValue > DEBUG_DATA_LENGTH) DEBUG_RecivedValue = 0;        //如果超过数组长度则跳转到数组开头
  22.         }
  23.         if (USART_GetFlagStatus(DEBUG_USART1, USART_IT_RXNE) != RESET)        //清除标志位用,备用
  24.                 USART_ClearITPendingBit(DEBUG_USART1, USART_IT_RXNE);
  25. }
复制代码


这个可以接受一定长度的字符串,但是16进制发送时要在结尾加上\n的16进制字符 这个还没研究出好点的判断接收完成的方法#define DEBUG_DATA_LENGTH                        512 这个是定义的接受数组长度
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 13:55:28 | 显示全部楼层
非谢家之宝树 发表于 2018-4-25 21:34
这是我自己参考网上的写的

然后我是不是用USART_SendData()这个函数发送数组就行了?
回复 支持 反对

使用道具 举报

发表于 2018-4-26 14:39:05 | 显示全部楼层
这个只是定义的接收的发送字符串的就用原来的就行了吧,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 14:54:47 | 显示全部楼层
非谢家之宝树 发表于 2018-4-26 14:39
这个只是定义的接收的发送字符串的就用原来的就行了吧,,

什么意思?没有太看懂你的意思,
回复 支持 反对

使用道具 举报

发表于 2018-4-26 15:13:41 | 显示全部楼层
小曹 发表于 2018-4-26 14:54
什么意思?没有太看懂你的意思,

就是我给的这部分只是接收的,发送的程序就看例程的就行咯
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 15:53:25 | 显示全部楼层
非谢家之宝树 发表于 2018-4-26 15:13
就是我给的这部分只是接收的,发送的程序就看例程的就行咯

void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
        unsigned int k=0;
  do
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* μè′y·¢Ëííê3é */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {}
}这个函数可以吗?还是用printf函数发送?
回复 支持 反对

使用道具 举报

发表于 2018-4-26 15:56:31 | 显示全部楼层
都可以吧,我这个在接收的数据末尾是加了字符串结束符的,不修改的话可以直接用string发送,printf我没有试过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 17:37:02 | 显示全部楼层
非谢家之宝树 发表于 2018-4-26 15:56
都可以吧,我这个在接收的数据末尾是加了字符串结束符的,不修改的话可以直接用string发送,printf我没有试 ...

那我是不是应该先把数字的值赋值给指针*str,然后输出指针就行了?
回复 支持 反对

使用道具 举报

发表于 2018-4-26 19:17:39 | 显示全部楼层
str是接受数组,多字节的数据。单字节还是用sendbyte的就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-27 14:03:22 | 显示全部楼层
非谢家之宝树 发表于 2018-4-26 19:17
str是接受数组,多字节的数据。单字节还是用sendbyte的就好了

但是我现在就是用数组接受的多字节呀,不然我用数组干嘛
回复 支持 反对

使用道具 举报

发表于 2018-4-27 16:21:15 | 显示全部楼层
小曹 发表于 2018-4-27 14:03
但是我现在就是用数组接受的多字节呀,不然我用数组干嘛

我是说你发送数据的时候的函数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-7 18:33:11 | 显示全部楼层
非谢家之宝树 发表于 2018-4-26 15:56
都可以吧,我这个在接收的数据末尾是加了字符串结束符的,不修改的话可以直接用string发送,printf我没有试 ...

我问一下,是不是我这个发送函数就是发送我串口接收到的数据,也就是你给我的串口接收函数。还是需要我把接收到的数据传给发送函数的形参?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-7 18:37:41 | 显示全部楼层
小曹 发表于 2018-5-7 18:33
我问一下,是不是我这个发送函数就是发送我串口接收到的数据,也就是你给我的串口接收函数。还是需要我把 ...

我知道了,应该把接受函数里面的数组定义成全局数组,然后通过 Usart_SendString()函数发送这个数组就行了,是这样的吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 04:28 , Processed in 0.036614 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表