OpenEdv-开源电子网

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

stm32普通IO口模拟串口通信(自己改的)

  [复制链接]

16

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-6-22
在线时间
7 小时
发表于 2014-1-27 15:24:30 | 显示全部楼层 |阅读模式
要做个项目需要7个串口,MCU上串口不够需要自己模拟,就到本论坛上找,不过没找到,最终找了下资料用原子哥的串口实验例程改的,成功了拿来分享一下,要是有什么问题也希望大家指点一下, 平时老是从这里获取,也希望能为论坛做点贡献。
为了方便跟电脑串口连接,io口仍选用PA9与PA10,不过这里只将它们当作变通的IO口使用。PA9对应TXD,PA10对应RXD的功能。串口配置是波特率9600,8位数据位,1位停止位,无校验位。
不过我也有个疑问,因为这个是按照原子哥的串口例程改的,所以结束标志就是收到0x0d,0x0a,这样就必须发字符串的时候发送新行,发16进制数最后要有0x0d,0x0a。我看到我往串口调试助手发送数据,根本就没发固定的结束标志啊,它都能立即接收并显示出来,它是依次接收一个字节就显示一个字节吗?我试了一下,只能正常接收第一个字节后面的都丢了。




发送数据

void SendOneByte(u8 Byte)
{
u8 i=8,tmp;
TXD_low(); //发送起始位
delay_us(104);
//发送8位数据
for(i=0;i<8;i++)
{
tmp = (Byte >> i) & 0x01;  //低位在前

if(tmp == 0)
{
TXD_low();
delay_us(104); //0
}
else
{
TXD_high();
delay_us(104); //1
}
}
// while(i--)
// {  
//  MNUSART_TXD = (Byte&0x01);     //先传低位
//  delay_us(104);  
//  Byte = Byte>>1;
//  //无校验位
//  MNUSART_TXD=1;//发送结束位
//  delay_us(104);
// }
TXD_high();
delay_us(104);

}

void SendBytes(u8 *str,u8 len) //发送数组最好用这个,也可发送字符串
{
  u16 i;
  for(i=0;i<len;i++)
  {
  SendOneByte(str);
  
  }

}

void SendStr(u8 *str) //发送字符串,发送数组如果带0x00就中断发送了
{
 while(*str)
 SendOneByte(*str++);

}

接收用的外部中断

void EXTIX_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   EXTI_InitTypeDef EXTI_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
   GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
   GPIO_SetBits(GPIOA,GPIO_Pin_9);  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //浮空输入
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
   GPIO_Init(GPIOA, &GPIO_InitStructure);  
   GPIO_SetBits(GPIOA,GPIO_Pin_10); 
   
     //GPIOA.10 中断线以及中断初始化配置   下降沿触发
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource10);

  EXTI_InitStructure.EXTI_Line=EXTI_Line10;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);
 

}


void EXTI15_10_IRQHandler(void)
{
   u8 i=9;
   if(EXTI_GetITStatus(EXTI_Line10) != RESET)
   {
     /* Disable the Selected IRQ Channels -------------------------------------*/
     NVIC->ICER[EXTI15_10_IRQn >> 0x05] =
      (uint32_t)0x01 << (EXTI15_10_IRQn & (uint8_t)0x1F);
 EXTI_ClearITPendingBit(EXTI_Line10);
 delay_us(30);
 while(i--)
 {
  tmp >>=1;
if(GPIOA->IDR&0x0400) tmp |=0x80;
delay_us(104);
 }
 if((USART_RX_STA&0x8000)==0)
 {
  if(USART_RX_STA&0x4000)
{
 if(tmp!=0x0a) USART_RX_STA=0;
 else USART_RX_STA |=0x8000;
}
else
{
  if(tmp==0x0d) USART_RX_STA|=0x4000;
  else 
  {
    USART_RX_BUF[USART_RX_STA&0X3FFF]=tmp ;
   USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收  
  }
}
 
 }

 EXTI_ClearITPendingBit(EXTI_Line10);
 NVIC->ISER[EXTI15_10_IRQn >> 0x05] =
    (uint32_t)0x01 << (EXTI15_10_IRQn & (uint8_t)0x1F);

   }

}

主函数

int main(void)
 {
  u8 len;
  u8 hello[]={0x5a,0xa5,0x00,0x00,0x01};
  delay_init();
  EXTIX_Init();
  //测试 发送一个字节
  SendOneByte(0x00);
  SendOneByte(0x01);
  SendOneByte(0x02);
 //测试发送数组
 SendBytes(hello,5);
 //测试发送字符串
// SendBytes("hello word",11);
// SendStr("德玛西亚");
 
  while(1)
{
 if(USART_RX_STA&0x8000)
 {  
    printf("\r\n您发送的消息为:\r\n\r\n");
  len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
SendBytes(USART_RX_BUF,len);
//也可以用下面的发送
// SendStr(USART_RX_BUF);
// for(len=0;len<200;len++)
// USART_RX_BUF[len]=0;
  printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
 }
}
 }







我的模拟串口实验.rar

3.15 MB, 下载次数: 38985

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-27 16:45:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-1-28 11:25:38 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2014-2-6 21:37:44 | 显示全部楼层
刚刚的
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
886
金钱
886
注册时间
2011-12-25
在线时间
12 小时
发表于 2014-2-6 23:20:35 | 显示全部楼层
回复【楼主位】贵在坚持:
---------------------------------
你的模拟串口,接受部分代码写的不好,没有采样,,直接延迟。。。建议采样频率为波特率的3-5倍。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

47

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2013-8-8
在线时间
0 小时
发表于 2014-2-7 15:46:13 | 显示全部楼层
NVIC->ICER[EXTI15_10_IRQn >> 0x05] =
       (uint32_t)0x01 << (EXTI15_10_IRQn & (uint8_t)0x1F);
楼主这个什么意思哈
___诺现在就觉得失望无力,未来那么远该怎么扛。
回复 支持 反对

使用道具 举报

11

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
652
金钱
652
注册时间
2012-8-1
在线时间
68 小时
发表于 2014-2-9 13:01:23 | 显示全部楼层
参考一下,谢谢分享
回复 支持 反对

使用道具 举报

27

主题

308

帖子

1

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2012-6-19
在线时间
19 小时
发表于 2014-2-11 12:24:34 | 显示全部楼层
楼主不错,顶起!
回复 支持 反对

使用道具 举报

16

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-6-22
在线时间
7 小时
 楼主| 发表于 2014-2-12 11:27:53 | 显示全部楼层
回复【6楼】__小黑先生:
---------------------------------
PA10上的下降沿将触发外部中断,这标志着“起始位0”的到来。在对应的中断服务程序中,会立即关闭该外部中断 NVIC->ICER[EXTI15_10_IRQn >> 0x05] =
       (uint32_t)0x01 << (EXTI15_10_IRQn & (uint8_t)0x1F);,以防后续的“数据位”误触发本中断。接收完毕之后,打开外部中断NVIC->ISER[EXTI15_10_IRQn >> 0x05] =
     (uint32_t)0x01 << (EXTI15_10_IRQn & (uint8_t)0x1F);
回复 支持 反对

使用道具 举报

47

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2013-8-8
在线时间
0 小时
发表于 2014-2-18 16:57:55 | 显示全部楼层
回复【9楼】贵在坚持:
---------------------------------
楼主你这函数哪学的呢
为什么我查函数库都没看到呢
还是寄存器版的才有?
___诺现在就觉得失望无力,未来那么远该怎么扛。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-2-21
在线时间
1 小时
发表于 2014-2-22 15:29:58 | 显示全部楼层
回复【5楼】冰是睡着的水:

回复【楼主位】贵在坚持:
---------------------------------
你的模拟串口,接受部分代码写的不好,没有采样,,直接延迟。。。建议采样频率为波特率的3-5倍。。

---------------------------------
串口没有采样之说,不是频率信号。假设如果把串口波特率放慢到1秒一位,一个字节的数据按照1位起始,8位数据,1位停止,共需要10秒。
每个位(包括起始、停止)的数值是高或者低,都需要在这个位对应的秒时读取。

例如第3位为高电平,从第4秒到第5秒这一秒的时间中,任何时刻读取数值都可以。
但是只能读取一次,及时读取多次,也不能把后续读取的数值作为第4位,只有当第5秒和第6秒到来时,才能读取第4位。

楼主写的程序,我持赞成态度。
使用起始位的从低到高电平跳转上升沿,触发外部中断。
然后关闭外部中断,防止8位数据中出现的电平跳转再次触发中断。打乱下面的while部分。
再然后清除中断标志,使delay_us可以起作用,因为这个delay用的是系统滴答中断。
然后延迟30uS,此时取电平正好是第一位数据,取到第8次,数据取完,取第9次,取出停止位。

再然后就没什么好说的了。

我感觉最后两段话,开中断可以有,清中断标志就不必了。
回复 支持 反对

使用道具 举报

16

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-6-22
在线时间
7 小时
 楼主| 发表于 2014-3-3 11:54:17 | 显示全部楼层
回复【10楼】__小黑先生:
---------------------------------
库函数里有的 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) 这个函数里面的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2014-6-9
在线时间
0 小时
发表于 2014-6-9 15:55:16 | 显示全部楼层
菜鸟的程序,在中断里接收,其他程序咱们办。
应该用外部中断和定时器配合做
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2014-7-9
在线时间
1 小时
发表于 2014-7-9 17:36:34 | 显示全部楼层
回复【11楼】lilanqing81:
---------------------------------
请问为什么"然后延迟30uS,此时取电平正好是第一位数据"? 是将每有一条语句的执行时间计算进去了吗?就可以把起始位电平过度掉?觉得起始位也占104us的,至少延时104us后才会读取第一位数据....麻烦lilanqing81给解析一下~~谢谢~
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-7-11
在线时间
0 小时
发表于 2014-7-11 16:03:15 | 显示全部楼层
谢谢楼主分享
爱情面包都总会有的。
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2014-7-11 17:11:18 | 显示全部楼层
感谢分享,版区有你更精彩!
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2014-7-11 17:20:41 | 显示全部楼层
很好的,感谢分享
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-1-6
在线时间
0 小时
发表于 2014-7-16 16:24:30 | 显示全部楼层
我看到了德玛西亚····
我都说略懂、其实是什么都不懂
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2014-7-17 10:49:12 | 显示全部楼层
有人测试过这个历程吗?为什么我测试不好用呢?
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2014-7-17 10:50:54 | 显示全部楼层
有人测试过此历程吗?我测试好像有点问题!
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-1-21
在线时间
5 小时
发表于 2014-7-18 11:44:50 | 显示全部楼层
非常感谢,赶紧去测试。
回复 支持 反对

使用道具 举报

9

主题

121

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
金钱
1608
注册时间
2014-7-8
在线时间
173 小时
发表于 2014-8-14 16:59:58 | 显示全部楼层
测试了这个程序,12个数据,前面8个数据正常,后面4个都不对!看来还要改进!
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2014-11-19 15:30:58 | 显示全部楼层
学习一下思路
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2014-12-8
在线时间
0 小时
发表于 2014-12-8 09:43:21 | 显示全部楼层
楼主,我想请教一下,为什么你这个程序,接收端口只能用PA10? 
我试了一下,改一下程序,用别的端口接收就不行呢?
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-4-3
在线时间
4 小时
发表于 2014-12-10 12:00:59 | 显示全部楼层
最好用定时器来配合GPIO来实现串口才更稳定
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
42
金钱
42
注册时间
2014-12-29
在线时间
4 小时
发表于 2014-12-29 15:28:06 | 显示全部楼层
回复【6楼】__小黑先生:
---------------------------这个你知道什么意思了吗??
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
42
金钱
42
注册时间
2014-12-29
在线时间
4 小时
发表于 2014-12-29 16:23:37 | 显示全部楼层
为什么我用PB.12接收就是不行,,就是接收不了呢,,谁能解释一下吗
回复 支持 反对

使用道具 举报

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2013-12-20
在线时间
94 小时
发表于 2015-1-7 16:41:36 | 显示全部楼层
楼主,你好,程序确实可用,我在测试时误打误撞,发现一个问题
     //GPIOA.10 中断线以及中断初始化配置   下降沿触发
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource10);
这条语句不调用的时候,一样能进入中断,是怎么回事呢
回复 支持 反对

使用道具 举报

47

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2013-8-8
在线时间
0 小时
发表于 2015-1-10 22:30:19 | 显示全部楼层
回复【26楼】伙计cp:
---------------------------------
嗯嗯  ICER 是中断失能寄存器 那句话意思就是失能寄存器
___诺现在就觉得失望无力,未来那么远该怎么扛。
回复 支持 反对

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-1-10 22:45:16 | 显示全部楼层
为什么不用定时器的捕获输入作为rx,比较输出作为tx,这样只需要根据波特率设置计时了吧,一个中断就可以了吧
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-26
在线时间
0 小时
发表于 2015-4-8 01:16:54 | 显示全部楼层
楼主好厉害,,
回复 支持 反对

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-3-12
在线时间
2 小时
发表于 2015-4-8 21:10:34 | 显示全部楼层
看见“德玛西亚”,我马上醉了
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-3-25
在线时间
0 小时
发表于 2015-5-2 16:02:28 | 显示全部楼层
回复【30楼】as564335sa:
---------------------------------
对你这个想法 新鲜, 能比较详细的说下你的思路么,如果用输出比较作为TX的话, 你的数据怎么发送,
TX 这个还是用通用的IO口 就行了
回复 支持 反对

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-5-2 20:06:40 | 显示全部楼层
回复【33楼】这就是个名字:
---------------------------------
这个我只在430中用过,因为工作用的430,首先如果使用这种方法,得根据时钟和波特率设置好1个bit的时间,也就是捕获和比较中断的时间,发送的话,定义一个16bit变量txd,然后将要发送的8bit数据插入起始位和停止位比如一个起始位一个停止位,就变成了10bit数据送给16位变量txd,开启比较中断,然后只需要在比较中断中按顺序判断txd的每一位,高就输出高,低就输出低,直到10个bit发送完毕即可关闭比较输出,一个字节就发送完成了。TX可以用通用IO也可以用比较输出引脚,具体情况而定。
回复 支持 反对

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-5-2 20:15:56 | 显示全部楼层
回复【33楼】这就是个名字:
---------------------------------
接收的时候,平时开启捕获模式,当捕获到第一个起始位的时候立刻切换为比较模式,比较中断时间由波特率而定,每次比较中断接收一个bit,接收完了再切回捕获等待下一次接收就行了,不知道你懂没懂
回复 支持 反对

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2015-5-5 16:26:26 | 显示全部楼层
mark一下!
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2015-6-18
在线时间
7 小时
发表于 2015-8-21 14:59:58 | 显示全部楼层
if((USART_RX_STA&0x8000)==0)
  {
    if(USART_RX_STA&0x4000)
 {
  if(tmp!=0x0a) USART_RX_STA=0;
  else USART_RX_STA |=0x8000;
哥,你串口模块寄存器都用上了哇!这还叫普通IO口转串口吗?我也是菜鸟,不知道说的对不对
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-10-7
在线时间
5 小时
发表于 2016-1-5 14:07:34 | 显示全部楼层
不解求 解答   如何延时不是在那里死等呢?
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-6-1
在线时间
11 小时
发表于 2016-6-12 09:28:32 | 显示全部楼层
好东西加以改进就是更好啦,谢谢!!
回复 支持 反对

使用道具 举报

38

主题

165

帖子

0

精华

高级会员

Rank: 4

积分
646
金钱
646
注册时间
2014-3-5
在线时间
67 小时
发表于 2016-6-12 17:26:43 | 显示全部楼层
接受部分处理不是很好,感谢分享
Hard work!
回复 支持 反对

使用道具 举报

16

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2013-6-22
在线时间
7 小时
 楼主| 发表于 2017-4-1 14:29:24 | 显示全部楼层
coc08 发表于 2015-8-21 14:59
if((USART_RX_STA&0x8000)==0)
        &nbsp;&nbsp;{
        &nbsp;&nbsp;        &nbsp;if(USART_RX_STA&0x4000)
                &nbsp;{
                 ...

USART_RX_STA只是原子哥例程里的一个变量而已,不是寄存器,刚开始学stm32时做的,确实很多不成熟的地方。
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2017-4-1 16:05:35 | 显示全部楼层
感谢分享               
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2017-4-20 22:15:53 | 显示全部楼层
//发送函数
void USART_TX(u8 TX_BUF)//普通io模拟usart TX脚
{
        u8 i;//数据长度
       
//起始位触发
        TX_pin=0;//TX脚电平
        delay_us(bit_delay);
//8个数据位
        for(i=0;i<8;i++)
      {
       if(TX_BUF&0X01)//低位先发
             {
              TX_pin=1;
              delay_us(bit_delay);
             }
              else
             {
              TX_pin=0;
              delay_us(bit_delay);
             }
       TX_BUF=TX_BUF>>1;//取下一个
      }
//发送完成
   TX_pin=1;
          
//   delay_us(bit_delay);//1个停止位
   delay_us(bit_delay*1.5);//1.5倍停止位
//   delay_us(bit_delay*2);//2倍停止位
}
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

21

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-3-6
在线时间
32 小时
发表于 2017-6-26 09:44:56 | 显示全部楼层
楼主很棒!期待测试通过
回复 支持 反对

使用道具 举报

21

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-3-6
在线时间
32 小时
发表于 2017-6-26 11:11:40 | 显示全部楼层
xzh5508 发表于 2014-8-14 16:59
测试了这个程序,12个数据,前面8个数据正常,后面4个都不对!看来还要改进!

我怎么测试不通过呢?我向调试助手循环发送一个字节,调试助手上没有反应,设置的波特率为9600,应该没有错
回复 支持 反对

使用道具 举报

21

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-3-6
在线时间
32 小时
发表于 2017-6-26 11:14:19 | 显示全部楼层
lsn10 发表于 2014-12-8 09:43
楼主,我想请教一下,为什么你这个程序,接收端口只能用PA10?&nbsp;
我试了一下,改一下程序,用别的端口 ...

我怎么测试不通过呢?我向调试助手循环发送一个字节,调试助手上没有反应,设置的波特率为9600,应该没有错
回复 支持 反对

使用道具 举报

1

主题

21

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-6-29
在线时间
11 小时
发表于 2017-7-17 14:54:47 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2018-7-25
在线时间
13 小时
发表于 2019-1-13 16:36:22 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-1-13
在线时间
5 小时
发表于 2019-1-13 16:58:02 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-4-11
在线时间
4 小时
发表于 2019-4-12 16:42:51 | 显示全部楼层
厉害厉害。学习一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 09:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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