OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5701|回复: 50

串口问题,请各位帮忙,之前发的帖子莫名其妙没有了

[复制链接]

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
发表于 2017-12-14 16:40:43 | 显示全部楼层 |阅读模式
60金钱
先介绍一下我用STM32f103的板子,板子发送显示在串口上是正常的。以下是发送的代码,能够在串口调试助手中显示出来55 AA 03 01 04。这是OK的,
               u8 G[7];
               G[0]=0x55;
               G[1]=0xAA;
               G[2]=0x03;
               G[3]=0x01;
               G[4]=0x04;
           for(i=0;i<5;i++)
               {  
           USART_SendData(USART2,G);
          while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
                }


    用串口调试助手给激光器发一次性发送五个十六进制数55 AA 03 01 04,激光器能够接受到并作出正常的响应。
    但是我利用上面的程序用STM32f103发十六进制数给激光器却没有任何响应。现在我拿串口2发送的数据接上串口调试助手,能够看到发送的数据确实是正确的。
   
                     我该怎么修改呢?真的不知道了,求回答,谢谢

关于上述问题,上次很多人都回复了,
                           1比如说串口的波特率,串口设置等,这个我都查了,没有问题。
                          2 还有人说是地线问题,这块我也排查了,用的232接口,应该没有问题。
                           3关于第一个数55丢失的问题,我做了调整。目前不会丢失数据。
                          4有人说串口调试助手末尾会发送0x0D 0x0A结束的事,我在程序里面试过多发送这个,结果也不行。

最佳答案

查看完整内容[请看2#楼]

双母头线是直通的,那就恰恰说明,一公一母的延长线需要交叉的。没有你得自己做一根延长线,2-3,3-2,5-5的。 再给你仔细分析一下: USB转232线:公头,2收/3发/5地。 激光器232座:公头,2发/3收/5地。俗称“假小子” 开发板232座:母头,2发/3收/5地。 所以: USB转232线直接连开发板:公→母,2收←2发,3发→3收,正常。 USB转232线通过双母头直通线连激光器:公→母→母→公,2收←2孔←2孔←2发,3发→3孔→3 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-14 16:40:44 | 显示全部楼层
本帖最后由 cxf0153 于 2017-12-15 19:15 编辑
gonewiththewind 发表于 2017-12-15 17:52
测了,是直通的,2-2,3-3这种

双母头线是直通的,那就恰恰说明,一公一母的延长线需要交叉的。没有你得自己做一根延长线,2-3,3-2,5-5的。

再给你仔细分析一下:
USB转232线:公头,2收/3发/5地。
激光器232座:公头,2发/3收/5地。俗称“假小子”
开发板232座:母头,2发/3收/5地。

所以:
USB转232线直接连开发板2收2发3发3收,正常。
USB转232线通过双母头直通线连激光器→母→母→2收←2孔←2孔←2发3发→3孔→3孔→3收,正常。
开发板通过一公和一母直通线连激光器→公→母→2发→2针≠2孔←2发3收←3针≠3孔→3收,错误。

正确的接法是:
开发板通过一公和一母交叉线激光器→公→母→2发2针→3孔3收3收3针←2孔2发,正常。
回复

使用道具 举报

23

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2015-1-25
在线时间
83 小时
发表于 2017-12-14 16:48:58 | 显示全部楼层
stm32 发送给激光器的的数据,同时焊接3根线连接到调试助手上看一眼,发的是什么
我之前也遇到过这种情况,最好在while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); 这个后面加一个delay_ms(5);
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-14 17:13:47 | 显示全部楼层
yklstudent 发表于 2017-12-14 16:51
USART_SendData(USART2,G);
你这个觉得正确????

这个是刚才打错了,是USART_SendData(USART2,G);
而且我现在连循环发送都不用了,直接采用USART_SendData(USART2,0x55);这种方式
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-14 17:15:48 | 显示全部楼层
neuangel 发表于 2017-12-14 16:48
stm32 发送给激光器的的数据,同时焊接3根线连接到调试助手上看一眼,发的是什么
我之前也遇到过这种情况 ...

我直接把串口2连接的PA2、PA3和地接出来道串口调试助手试了,这样看是对的,只是仪器还是没有反应。delay_ms(5)这个我也加上了
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-14 18:09:17 | 显示全部楼层
刚在接收端焊接了三根线出来,发送55 AA 05 03 00 32 3A,发现接收到55 15 7D 7E 00 33 31。这是怎么回事啊
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-14 18:11:36 | 显示全部楼层
感觉显示不对,应该是波特率的问题,但是真的波特率都是9600的啊,这又是什么问题啊?
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-14 18:34:12 | 显示全部楼层
找到毛病在哪里了,我把插到激光器那端的线抛开,然后并了rx、tx、gnd三根线到串口调试助手上看。发现我发送55 AA 05 03 00 32 3A过去,那边接收的并不是这个,而是55 15 7D 7F 00 33 31。发送55 AA 03 01 04过去,接收到的是55 15 7E 7F 1F。我要不这样做,直接串口2输出的接入串口调试助手,显示的就是对的。是不是激光器232线里面地线接触不良啊?
知道毛病在哪里了,可还是不会解决啊
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-14 18:35:41 | 显示全部楼层
neuangel 发表于 2017-12-14 16:48
stm32 发送给激光器的的数据,同时焊接3根线连接到调试助手上看一眼,发的是什么
我之前也遇到过这种情况 ...

大神,发送正确,但接收的信号不对,这该怎么办啊?
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2017-12-14 19:51:26 | 显示全部楼层
本帖最后由 胖子阳 于 2017-12-14 19:52 编辑

1、激光器是232电平,STM32以及串口调试助手转换的都是TTL电平,两者电平不匹配,即使共地应该也是有问题的,你将232电平通过一个转换芯片转成TTL电平试一试,应该就行了。
2、串口发送一般我是这样用的while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);USART_SendData(USART2,G);先判断是否为空,再发送数据,可以改改试一试。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-15 05:18:33 | 显示全部楼层
//如果楼主,硬件初始化部分,没有错误,用以下程序应该是可以正常发送出来你要的数据.
//..如果对方还是不能正常收到数据.楼主要看一下协议部分.
// 激光接收器是不是9600,8,N,1的格式要求.
u8 G[7];
               G[0]=0x55;
               G[1]=0xAA;
               G[2]=0x03;
               G[3]=0x01;
               G[4]=0x04;
           for(i=0;i<5;i++)
               {
           while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
           USART_SendData(USART2,G[i]);
         
                }
回复

使用道具 举报

23

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2015-1-25
在线时间
83 小时
发表于 2017-12-15 08:42:46 | 显示全部楼层
有可能是激光器内的 232有点问题,你试试其他的232的设备?首先保证你发送这端没问题
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 10:07:47 | 显示全部楼层
胖子阳 发表于 2017-12-14 19:51
1、激光器是232电平,STM32以及串口调试助手转换的都是TTL电平,两者电平不匹配,即使共地应该也是有问题的 ...

测出来数据错,确实有可能是232电平的原因,这点之前忘记啦,谢谢。    我按照你说的改了,对面激光器还是没有反应
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 10:09:04 | 显示全部楼层
neuangel 发表于 2017-12-15 08:42
有可能是激光器内的 232有点问题,你试试其他的232的设备?首先保证你发送这端没问题

如果激光器内部的232有问题,那么怎么会用串口调试助手直接发有效,而用stm32发无效呢?略怪啊
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 10:19:52 | 显示全部楼层
操作系统 发表于 2017-12-15 05:18
//如果楼主,硬件初始化部分,没有错误,用以下程序应该是可以正常发送出来你要的数据.
//..如果对方还是不能 ...

这是对方给的他们的测试代码,他们用的是按键中断,发送方式和我一样,他们说可以
while (1)
{
key_value=key_read();
                  
switch(key_value)
{
case mov_up:
      
                   break;
case mov_down:
      
                   break;
case esc:
           Uart1_PutChar(0x55);
           Uart1_PutChar(0xaa);
           Uart1_PutChar(0x03);
           Uart1_PutChar(0x01);
           Uart1_PutChar(0x04);               
               break;
case enter:
           Uart1_PutChar(0x55);
           Uart1_PutChar(0xaa);
           Uart1_PutChar(0x05);
           Uart1_PutChar(0x03);
           Uart1_PutChar(0x00);
           Uart1_PutChar(0x32);
           Uart1_PutChar(0x3a);
    break;  
case on_off:   
          break;
  }   
}

其中Uart1_PutChar函数的定义如下:(里面usart_senddata用的是原子的库函数)
u8 Uart1_PutChar(u8 ch)
{
   
    USART_SendData(USART1, (u8) ch);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
   {
   }
   return ch;
}

我们板子和他们,我是用stm32f103,于是我就按照他们的那个改了,感觉没啥错,不过对面还是没反应[mw_shl_code=c,true]这是我的测试代码
#include "USART2.h"
#include "stm32f10x.h"
//&acute;&reg;&iquest;&Uacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;
void USART2_init(u32 bound)
{
        GPIO_InitTypeDef  GPIO_InitStrue;
        USART_InitTypeDef USART_InitStrue;
        NVIC_InitTypeDef NVIC_InitStrue;
//&Ecirc;±&Ouml;&Oacute;&Ecirc;&sup1;&Auml;&Uuml;       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//GPIO2&Ecirc;&sup1;&Auml;&Uuml;TX       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;//
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_2;                               
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;               
        GPIO_Init(GPIOA,&GPIO_InitStrue);                                       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_3;                                               
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;               
        GPIO_Init(GPIOA,&GPIO_InitStrue);                                         //&cedil;ù&frac34;&Yacute;&Eacute;è&para;¨&sup2;&Icirc;&Ecirc;&yacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;GPIOA_10
//USART&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;
        USART_InitStrue.USART_BaudRate=bound;//&sup2;¨&Igrave;&Oslash;&Acirc;&Ecirc;
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//&Icirc;&THORN;&Oacute;&sup2;&frac14;&thorn;&Aacute;÷&iquest;&Oslash;&Ouml;&AElig;
        USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//&Ecirc;&sup1;&Auml;&Uuml;·&cent;&Euml;&Iacute;&iexcl;&cent;&frac12;&Oacute;&Ecirc;&Otilde;
        USART_InitStrue.USART_Parity=USART_Parity_No;//&Icirc;&THORN;&raquo;ù&Aring;&frac14;&ETH;&pound;&Ntilde;é
        USART_InitStrue.USART_StopBits=USART_StopBits_1;//&Iacute;&pound;&Ouml;&sup1;&Icirc;&raquo;1&Icirc;&raquo;
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;//&Ecirc;&yacute;&frac34;&Yacute;8&Icirc;&raquo;
        USART_Init(USART2,&USART_InitStrue);//&cedil;ù&frac34;&Yacute;&Eacute;è&para;¨&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;USART1
//USART1&Ecirc;&sup1;&Auml;&Uuml;
        USART_Cmd(USART2,ENABLE);
//&iquest;&ordf;&Ouml;&ETH;&para;&Iuml;
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//&iquest;&ordf;&Ouml;&ETH;&para;&Iuml;USART1
        NVIC_InitStrue.NVIC_IRQChannel=USART2_IRQn;//&Iacute;¨&micro;&Agrave;
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//&Ecirc;&sup1;&Auml;&Uuml;
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//&Ccedil;&Agrave;&Otilde;&frac14;&Oacute;&Aring;&Iuml;&Egrave;&frac14;&para;
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//×&Oacute;&Oacute;&Aring;&Iuml;&Egrave;&frac14;&para;
        NVIC_Init(&NVIC_InitStrue);
}

void delayms(u16 ms)
{
u32 i;
while(ms--)
{
  for(i = 0; i < 12000; i++);
  
}
}

u8 Uart2_PutChar(u8 ch)
{
   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
    USART_SendData(USART2, (u8) ch);
//         while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)  {}
           delayms(5);
   return ch;
}

//
void USART2_IRQHandler(void)
{
}
int main(void)
{  
        int t;
        NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);
        USART2_init(9600);
        while(1)
        {   
                 Uart2_PutChar(0x55);
           Uart2_PutChar(0xaa);
           Uart2_PutChar(0x05);
           Uart2_PutChar(0x03);
           Uart2_PutChar(0x00);
           Uart2_PutChar(0x32);
           Uart2_PutChar(0x3a);
        //         delayms(9999);
               
      Uart2_PutChar(0x55);
           Uart2_PutChar(0xaa);
           Uart2_PutChar(0x03);
           Uart2_PutChar(0x01);
           Uart2_PutChar(0x04);
                 delayms(9999);delayms(9999);delayms(9999);delayms(9999);delayms(9999);
                delayms(9999);delayms(9999);delayms(9999);delayms(9999);
                delayms(9999);delayms(9999);delayms(9999);delayms(9999);
        }
}
[/mw_shl_code]
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 10:26:47 | 显示全部楼层
上面代码不方便看,这是我的测试代码,发的数据通过一根232转USB线,接到串口调试助手看,没有问题。

串口2.zip

5.72 MB, 下载次数: 123

回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-15 10:39:20 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 10:26
上面代码不方便看,这是我的测试代码,发的数据通过一根232转USB线,接到串口调试助手看,没有问题。

把串口调试工具的接收与发送的信息贴上来
把串口调试工具的配置贴上来
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2017-12-15 11:01:25 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 10:26
上面代码不方便看,这是我的测试代码,发的数据通过一根232转USB线,接到串口调试助手看,没有问题。

是的,你把测试拍个图上传一下,以及通过串口调试助手调试时的调试助手界面拍一下看看
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 11:05:03 | 显示全部楼层
lanlzp 发表于 2017-12-15 10:39
把串口调试工具的接收与发送的信息贴上来
把串口调试工具的配置贴上来

C:\Users\Administrator\Desktop
捕获.JPG
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 11:08:55 | 显示全部楼层
本帖最后由 gonewiththewind 于 2017-12-15 11:10 编辑
胖子阳 发表于 2017-12-15 11:01
是的,你把测试拍个图上传一下,以及通过串口调试助手调试时的调试助手界面拍一下看看

ok,我发上来您看下

串口1下载,串口2发送

串口1下载,串口2发送

串口调试助手接收

串口调试助手接收
回复

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2017-12-15 11:09:16 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 10:26
上面代码不方便看,这是我的测试代码,发的数据通过一根232转USB线,接到串口调试助手看,没有问题。

不对,串口2那里判断语句u8 Uart2_PutChar(u8 ch)
{
   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
    USART_SendData(USART2, (u8) ch);
//   while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)  {}
    delayms(5);
   return ch;
}
是不是不对啊,不是判断USART_FLAG_TXE这位吗,怎么是USART_FLAG_TC?你把上面判断改成USART_FLAG_TXE试一试。
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 11:11:49 | 显示全部楼层
胖子阳 发表于 2017-12-15 11:09
不对,串口2那里判断语句u8 Uart2_PutChar(u8 ch)
{
   while(USART_GetFlagStatus(USART2,USART_FLAG_ ...

这两个都可以,一个是判断是否为空,为空发送。一个是判断是否发送结束。这两个注释任何一个都没关系,我都测试了,都能够发送出去
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-15 11:18:16 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 11:11
这两个都可以,一个是判断是否为空,为空发送。一个是判断是否发送结束。这两个注释任何一个都没关系,我 ...

建议判断TXE会比较好,另外麻烦发一下,你通过串口调试助手发送数据到激光器的调试工具截图以及连线
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-16
在线时间
5 小时
发表于 2017-12-15 12:06:00 | 显示全部楼层
gonewiththewind 发表于 2017-12-14 17:13
这个是刚才打错了,是USART_SendData(USART2,G);
而且我现在连循环发送都不用了,直接采用USART_SendDat ...

C:\Users\momooy\Desktop
你的G定义是数组,函数设置的是uint16_t,怎么能正常发送
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-15 13:17:18 | 显示全部楼层
串口助手收到了.那就是程序是对的了.剩下的是激光接收器的接口问题.激光接收器是用的TTL电平.还是其它的??
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 14:16:43 | 显示全部楼层
本帖最后由 gonewiththewind 于 2017-12-15 14:21 编辑
lanlzp 发表于 2017-12-15 11:18
建议判断TXE会比较好,另外麻烦发一下,你通过串口调试助手发送数据到激光器的调试工具截图以及连线

好的,发过来您看下

这个是连接,串口调试助手直接发送给激光器

这个是连接,串口调试助手直接发送给激光器

这个是发送代码

这个是发送代码

激光器亮了

激光器亮了
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 14:24:47 | 显示全部楼层
lanlzp 发表于 2017-12-15 11:18
建议判断TXE会比较好,另外麻烦发一下,你通过串口调试助手发送数据到激光器的调试工具截图以及连线

我解释一下,串口调试助手通过USB转232与激光器连接,先发送光强信号 55 AA 05 03 00 32 3A给激光器,之后再发送55 AA 03 01 04给激光器,此时激光器打开。
在发送过程中,激光器会回传一个数,这个不用管,每次回传的都是一个数,可以认为是假回传。
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 14:25:34 | 显示全部楼层
操作系统 发表于 2017-12-15 13:17
串口助手收到了.那就是程序是对的了.剩下的是激光接收器的接口问题.激光接收器是用的TTL电平.还是其它的??

232线接过去的,应该是232电平吧
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 14:27:39 | 显示全部楼层
不加标点 发表于 2017-12-15 12:06
你的G定义是数组,函数设置的是uint16_t,怎么能正常发送

我已经改成  USART_SendData(USART2, (u8) ch);这种的了,也从循环发送变成了每个每个的发送
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-15 14:30:19 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 14:16
好的,发过来您看下

看你调试助手 勾选了发送新行,那发的数据就会多发 0X0D,0X0A
你在你代码里每条命令后 再加上0X0D,0X0A就对了
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-15 14:36:40 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 14:16
好的,发过来您看下

已知条件:
1) PC机232口和USB转232口都是公的,2收3发5地。
2) 20楼的图说明开发板的232座是母的,2发3收5地。
3) 26楼的图说明激光器串口线出口是母的,2发3收5地。
结论:
20楼的开发板要和26楼的激光器连接,需要一条公对公交叉线,请确认你的连接线是否正确。用万用表测量公对公交叉线:2针通另一头3针,3针通另一头2针,5针通另一头5针。
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 14:46:59 | 显示全部楼层
本帖最后由 gonewiththewind 于 2017-12-15 14:48 编辑
lanlzp 发表于 2017-12-15 14:30
看你调试助手 勾选了发送新行,那发的数据就会多发 0X0D,0X0A
你在你代码里每条命令后 再加上0X0D,0X0A就 ...

这样做不行啊,之前就试过这个,刚才又试了这个,您看下图。

这是发送函数

这是发送函数

这是拿串口看得

这是拿串口看得
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 14:59:14 | 显示全部楼层
本帖最后由 gonewiththewind 于 2017-12-15 15:00 编辑
cxf0153 发表于 2017-12-15 14:36
已知条件:
1) PC机232口和USB转232口都是公的,2收3发5地。
2) 20楼的图说明开发板的232座是母的,2发 ...

     
stm32 usb转232口是母口 激光器的口是公口 ,然后我们用的线是平行线,您看有错么?

stm32的母口

stm32的母口

激光器的公口

激光器的公口

连接线

连接线
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-15 15:02:26 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 14:46
这样做不行啊,之前就试过这个,刚才又试了这个,您看下图。

@cxf0153 请楼主确认接线问题,数据需要发送回车换行
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-15 15:04:02 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 14:59
stm32 usb转232口是母口 激光器的口是公口 ,然后我们用的线是平行线,您看有错么?

如果说激光器是公的,那你在26楼的图中是怎么把激光器和同样是公的USB转232连起来的呢?
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-15 15:13:07 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 14:59
stm32 usb转232口是母口 激光器的口是公口 ,然后我们用的线是平行线,您看有错么?

关键是你在26楼的图,激光器是公的,电脑上那根USB转232的线也是公的。应该还有一根两头都是母的线,否则你26楼怎么通讯?
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 15:14:32 | 显示全部楼层
cxf0153 发表于 2017-12-15 14:36
已知条件:
1) PC机232口和USB转232口都是公的,2收3发5地。
2) 20楼的图说明开发板的232座是母的,2发 ...

这是连接线的资料,我测了,对应通道都是通的
318880682.jpg
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7563
金钱
7563
注册时间
2016-11-30
在线时间
643 小时
发表于 2017-12-15 15:20:20 | 显示全部楼层
找到毛病在哪里了,我把插到激光器那端的线抛开,然后并了rx、tx、gnd三根线到串口调试助手上看。

说一下,你这么干是有问题的。这样电平会混乱的。你要监听的话,只能接rx和gnd两根线。监听那根线就接到那根线上去就行。
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 15:21:35 | 显示全部楼层
cxf0153 发表于 2017-12-15 15:13
关键是你在26楼的图,激光器是公的,电脑上那根USB转232的线也是公的。应该还有一根两头都是母的线,否则 ...

哦哦,26楼这张图是这样的。电脑USB转232的线是公口,然后还有一个232的母对母的线。这样发送是可以控制的。
然后现在用stm32的话,应该直接用一个公对母的232线就可以吧?
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-10-14
在线时间
8 小时
发表于 2017-12-15 15:25:43 | 显示全部楼层
软件串口发代码应该不会有什么问题,主要是硬件连接要正确,我发十六进制数据完全OK,如果你有从你的板上面引TX,RX,GND到串口助手看的话,那么在你跟激光器直接收发的时候把引出来的线去掉试试。
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-15 15:33:46 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 15:21
哦哦,26楼这张图是这样的。电脑USB转232的线是公口,然后还有一个232的母对母的线。这样发送是可以控制 ...

测量一下那根母对母的线,是直通(2口-2口,3口-3口)的还是交叉(2口-3口,3口-2口)的。
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 17:49:22 | 显示全部楼层
lvkanger 发表于 2017-12-15 15:20
找到毛病在哪里了,我把插到激光器那端的线抛开,然后并了rx、tx、gnd三根线到串口调试助手上看。

说一 ...

这样确实有问题,232电平直接接到串口调试助手看,会错误的,不能这样看
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 17:52:16 | 显示全部楼层
cxf0153 发表于 2017-12-15 15:33
测量一下那根母对母的线,是直通(2口-2口,3口-3口)的还是交叉(2口-3口,3口-2口)的。

测了,是直通的,2-2,3-3这种
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-15 22:07:01 | 显示全部楼层
本帖最后由 gonewiththewind 于 2017-12-16 11:07 编辑
cxf0153 发表于 2017-12-15 19:03
双母头线是直通的,那就恰恰说明,一公一母的延长线需要交叉的。没有你得自己做一根延长线,2-3,3-2,5- ...

谢谢啦,我尝试一下。
我现在拿线接了一下,把延长线的母口2接到激光器的公口3,把延长线的母口3接到激光器的公口2,把延长线的5地接到激光器的5,这样子试了一下,发现激光器没有反应。
明天我去买根交叉的公对母线,再试一下,先谢过。
1597400385.jpg
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-15 23:37:23 | 显示全部楼层
gonewiththewind 发表于 2017-12-15 22:07
谢谢啦,我尝试一下。
我现在拿线接了一下,把延长线的母口2接到激光器的公口3,把延长线的母口3接到激 ...

你用的是一头针一头孔的杜邦线?我以前也用过,用杜邦线的针插到DB9的孔里很难导通的。
如果没有交叉线,你可以买一公一母两个DB9带焊盘的头子,自己焊一下三根线。
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-12-16 09:05:01 | 显示全部楼层
楼主,我有一个疑问:
PC发到STM32的数据,你是否通过串口打印出来,看是否接收正确?

因为按照你的说法,PC->激光器是正常的,那就可以证明激光器不存在问题。
而STM32->激光器出问题,多半是硬件上的问题,如果你有示波器,调成直流模式去测以下TX这根线,将PC->激光器和
STM32->激光器的波形进行对比,应该就能够发现问题。
如果两者波形的电平不匹配,那就修改下硬件连接;如果波形是匹配的,那么就应该是软件的问题,建议从串口格式着手。
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-12-16 09:09:55 | 显示全部楼层
补充一点:
使用示波器测量时,需要测量两种情况:连接激光器和不连接激光器。
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-18 11:32:20 | 显示全部楼层
cxf0153 发表于 2017-12-15 15:33
测量一下那根母对母的线,是直通(2口-2口,3口-3口)的还是交叉(2口-3口,3口-2口)的。

真的是这个问题,太感谢了!!!我对这块没什么经验,以前是买了线就用,现在才知道还有这些。非常感谢
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-18 11:32:54 | 显示全部楼层
JUSTNIUB 发表于 2017-12-16 09:09
补充一点:
使用示波器测量时,需要测量两种情况:连接激光器和不连接激光器。

谢谢了,目前已经出光了
回复

使用道具 举报

7

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2015-11-28
在线时间
30 小时
 楼主| 发表于 2017-12-18 11:33:36 | 显示全部楼层
感谢论坛的各位,感谢大家的帮助,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 04:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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