OpenEdv-开源电子网

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

自己实现的printf格式化输出液晶,发现异常的方便,半个月时间打造,倾情奉上。。。欢迎捧场和拍砖

  [复制链接]

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-8-15 09:29:11 | 显示全部楼层 |阅读模式

大家是不是觉得C标准库里面的printf函数特别的好用呢?FatFs文件系统也有一个f_printf函数,大部分时候这个函数是很好用的。

自己就折腾了一段时间,终于将基本用到的功能实现了。

函数如下

[mw_shl_code=c,true]/** ***************************************************************************** * @Name : printf格式化输出到液晶 * * @Brief : none * * @Input : lcd_ch: printf结构体指针 * format: 格式化字符串 * ...: 长参数 * * @Output : none * * @Return : none ***************************************************************************** **/ int LCD_printf(_Typedef_lcdprintf* lcd_pr/* 结构参数 */, const u8 *format/* 格式化参数 */, .../* 长参数 */) { const char *str; char c=0; float valflt=0; int dec=0; u8 index=0; va_list ap; va_start(ap, format); lcd_pr->min_width = 7; lcd_pr->precision = 3; lcd_pr->charcnt = 0; while(*format != '\0') //直到遇到结束符 { if(*format == 0x5c) //符号'\' { format++; switch(*format) { case 'r': //LF _printfch(lcd_pr, '\r'); format++; break; case 'n': //CR _printfch(lcd_pr, '\n'); format++; break; case 't': //Tab _printfch(lcd_pr, '\t'); format++; break; default: format++; break; } } else if(*format == '%') //带格式输出 { format++; index = 0; lcd_pr->min_width = 0; while((*format <= '9') && (*format >= '0')) //域宽 { lcd_pr->min_width = (lcd_pr->min_width * index * 10) + (*format - '0'); index++; format++; } if(*format == '.') //检测到点 { format++; index = 0; lcd_pr->precision = 0; while((*format <= '9') && (*format >= '0')) //精度 { lcd_pr->precision = (lcd_pr->precision * index * 10) + (*format - '0'); index++; format++; } } switch(*format) //检测格式码 { case '%': //输出%符号 _printfch(lcd_pr, '%'); lcd_pr->cursorx += lcd_dev.ascii_w; format++; break; case 'c': //输出字符 c = va_arg(ap, int); _printfch(lcd_pr, c); format++; break; case 'S': case 's': //输出字符串 str = va_arg(ap, const char *); _printfstr(lcd_pr, (char*)str); format++; break; case 'd': //输出十进制数 dec = va_arg(ap, int); _printfint(lcd_pr, dec); format++; break; case 'f': //输出浮点数 valflt = va_arg(ap, double); _printfflt(lcd_pr, valflt); format++; break; case 'X': case 'x': //输出十六进制数 dec = va_arg(ap, int); _printfhex(lcd_pr, dec, 16); format++; break; case 'o': //输出八进制数 dec = va_arg(ap, int); _printfhex(lcd_pr, dec, 8); format++; break; case 'm': dec = va_arg(ap, int); if(dec > 21) dec = 21; //限制最大的域宽是21,包括小数点 lcd_pr->min_width = (u16)dec; format++; if(*format == '.') { format++; if(*format == 'n') { dec = va_arg(ap, int); if(dec > 8) dec = 8; //限制最小的小数精度是,0.00000001 lcd_pr->precision = (u16)dec; format++; if(*format == 'f') { valflt = va_arg(ap, double); _printfflt(lcd_pr, valflt); format++; } } } break; default: _printfch(lcd_pr, *format); format++; break; } //end check format } else if(*format < 0x80) //字符输出 { _printfch(lcd_pr, *format); lcd_pr->cursorx += lcd_dev.ascii_w; //下一个字符位置 format++; } #if _LCD_Support_GBK==1 //支持中文 else { LCD_Draw_GBK(lcd_pr->cursorx, lcd_pr->cursory, (u8*)format++, (u8)lcd_pr->mode); lcd_pr->cursorx += lcd_dev.gbk_w; format++; lcd_pr->charcnt++; } #endif } //end while va_end(ap); return (int)lcd_pr->charcnt; }[/mw_shl_code]

功能使用说明:

1、函数直接返回输出字符的个数,不包含’\r’、’\n’、’\t’符号的计数,或者直接读取结构体lcd_printf.charcnt也是可以得到输出字符总数的,最大为256

2、具体实现功能如下:

    A、直接打印字符串,支持中文

    B、%c输出字符

    C、%%输出%符号

    D、%d输出十进制数,有正负之分

    E、%f输出浮点数,默认域宽是7,小数精度是0.001,小数点包含在域宽内,有正负之分(下同)

    F、%12.5f输出一定长度和精度的浮点数,12就是域宽,5就是小数精度

    G、%m.nf自定义输出指定域宽和长度可变的浮点数,限制最大的域宽21,精度0.00000001

    H、%s输出字符串,支持中文输出

    I、%x(或者%X)输出十六进制数,前序统一显示为“0x

    J、%o输出八进制数,前序显示为0

    K、支持回车功能’\n’

    L、支持换行功能’\r’

    M、支持Tab功能’\t’,默认4ASCII空位

3、测试代码

[mw_shl_code=c,true]lcd_printf.cursorx = 30; lcd_printf.cursory = 287+48; LCD_printf(&lcd_printf, "Hello\tWord!\n"); LCD_printf(&lcd_printf, "Hello WarShip & 原子哥!\n"); LCD_printf(&lcd_printf, "LCD Printf Test->%s\n", (u8*)menu_buf[2][1]); LCD_printf(&lcd_printf, "Congratulations!!!\n"); LCD_printf(&lcd_printf, "the float&m.n is:%m.nf\n", (int)5, (int)2, (float)655.353); LCD_printf(&lcd_printf, "The Pre is:%c", 0x38); lcd_printf.cursorx += lcd_dev.ascii_w; LCD_printf(&lcd_printf, "%%\n"); LCD_printf(&lcd_printf, "LCD ID is:%x\n", (u16)lcd_dev._lcdobj.lcdid); LCD_printf(&lcd_printf, "LCD ID is:%d\n", (u16)9328); LCD_printf(&lcd_printf, "LCD ID is:%8.3f\n", (float)293.283); LCD_printf(&lcd_printf, "LCD ID is:%f\n", (float)-293.283); LCD_printf(&lcd_printf, "LCD ID is:%d\n", (int)-9328); LCD_printf(&lcd_printf, "Hello Printf!\n"); LCD_printf(&lcd_printf, "String is:%s\n", (u8*)menu_buf[0][1]); LCD_printf(&lcd_printf, "您好\n"); LCD_printf(&lcd_printf, "中文字符串是:%s\n", (u8*)menu_buf[0][0]); LCD_printf(&lcd_printf, "Long Parameter is: d%d, f%f, 0x9325->%x\n", (u16)1338, (float)13.88, (u16)9325); LCD_printf(&lcd_printf, "8 hex is:9325->%o\n", (u16)9325); i = (u8)LCD_printf(&lcd_printf, "Hello Printf!\n"); //13 LCD_printf(&lcd_printf, "String Len is: %d\n", (u8)i); //13 LCD_printf(&lcd_printf, "最后整体测试结果是->%s!!!\n", (u8*)menu_buf[2][1]);[/mw_shl_code]



附上4.3寸屏幕测试“裸照”和战舰测试工程:




附:
想要改变某个行的背景颜色(画笔颜色类似),这个版本可以这样操作,后续版本增加直接修改背景颜色和画笔颜色的函数,步骤如下:
1、先保存之前的背景颜色:old_color = lcd_dev._lcdobj.backcol
2、设置新的颜色值          :LCD_Set_BackCol(news_color)
3、显示完这行之后(多行也可以)再变回原来的颜色即可:LCD_Set_BackCol(old_color)

LCD_printf_test.zip

1.37 MB, 下载次数: 2888

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-8-15 09:34:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-8-15 09:34:45 | 显示全部楼层
再顶楼主的无私贡献
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-8-15 09:35:20 | 显示全部楼层
继续拜读楼主的佳作,哈哈,谢分享
合肥-文盲
回复 支持 反对

使用道具 举报

3

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-10-15
在线时间
4 小时
发表于 2014-8-15 09:51:33 | 显示全部楼层
谢谢楼主分享啊!!!!
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-2-24
在线时间
4 小时
发表于 2014-8-15 09:53:07 | 显示全部楼层
niubilitiy。。。顶~~~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-15 10:32:39 | 显示全部楼层
badu这用的是我们的4.3屏啊.呵呵.
设计的不错,cool
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 10:36:38 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
就是原子哥的4.3寸屏幕,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2014-8-15 11:42:52 | 显示全部楼层
nb,必须得好好学习。
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 12:42:21 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
感谢原子哥百忙中光临捧场,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 12:43:13 | 显示全部楼层
回复【4楼】合肥-文盲:
---------------------------------
哈哈,实现了这个,几乎用到显示液晶的这个函数都通杀,呵呵,目前是这样
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 12:43:34 | 显示全部楼层
回复【5楼】Okbu:
---------------------------------
谢谢捧场!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 12:43:49 | 显示全部楼层
回复【6楼】denishan:
---------------------------------
呵呵。。。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 12:44:24 | 显示全部楼层
回复【9楼】wangyan915205:
---------------------------------
大家互相学习,多谢捧场!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-8-15 12:47:11 | 显示全部楼层
Mark,好资料!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-8-15 13:10:28 | 显示全部楼层
回复【14楼】Badu_Space:
---------------------------------
这个函数能改变要显示的行的背景色吗(单独某一行)
合肥-文盲
回复 支持 反对

使用道具 举报

26

主题

194

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1175
金钱
1175
注册时间
2011-8-20
在线时间
21 小时
发表于 2014-8-15 15:02:07 | 显示全部楼层
好东西,感谢楼主无私的奉献。

http://elm-chan.org/fsw/strf/xprintf.html
for( int i=0; i<(1.0/0); i++ ) { for( int j=0; j<365; j++) money ++; age ++; if( age > 30 ) ChangeJob( Boss ); } 脸上的痘痘提醒我?我还年轻?口袋的米米告诉我?我仍需努力
回复 支持 反对

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-8-15 15:32:00 | 显示全部楼层
Badu哥真是给力!
不用谢了……
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 16:21:12 | 显示全部楼层
回复【16楼】合肥-文盲:
---------------------------------
可以改变背景颜色的,按下面的顺序来即可
1、换之前先保存原来的颜色值old_color = lcd_dev._lcdobj.backcol
2、设置这一行的颜色值LCD_Set_BackCol(news_color)
3、再将原来的颜色值填充回去LCD_Set_BackCol(old_color)


忘记做一个读取画笔和背景颜色的函数了,晚上回去搞搞,呵呵,多谢提醒啊!!!

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 16:22:24 | 显示全部楼层
回复【17楼】subo19920716:
---------------------------------
把文件系统都给链接过来了啊,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 16:22:39 | 显示全部楼层
回复【18楼】eling13:
---------------------------------
多谢捧场!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 16:27:59 | 显示全部楼层
回复【15楼】z1234zz:
---------------------------------
多谢捧场!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-8-15 16:58:00 | 显示全部楼层
谢谢奉献,还在128*128的屏上折腾DSP参数菜单,以后可能用得着。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 17:28:06 | 显示全部楼层
回复【23楼】ArchiChain:
---------------------------------
没玩过这个屏幕
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-8-15 17:55:11 | 显示全部楼层
回复【24楼】Badu_Space:
---------------------------------
记得你以前搞个个USB HID,STM32自己有什么标志位检测上位机是否连接吗?
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-8-15 18:58:43 | 显示全部楼层
谢谢分享。。。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2014-8-15 19:27:14 | 显示全部楼层
楼主辛苦了,练练手还可以,实际调试程序用串口是最省资源最方便的额...
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 19:33:20 | 显示全部楼层
回复【27楼】倒拔萝卜:
---------------------------------
额,这个显示液晶很方便,一个函数几乎搞定所有的显示,和标准库里的可以同时用,不冲突
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 19:34:00 | 显示全部楼层
回复【26楼】xiaoyan:
---------------------------------
感谢版主光临!!!欢迎提出宝贵意见
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-15 19:34:50 | 显示全部楼层
回复【25楼】ArchiChain:
---------------------------------
里面有个标志的,读一下就行了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-8-15 19:52:02 | 显示全部楼层
谢谢分享啊。。。谢谢
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-6-30
在线时间
29 小时
发表于 2014-8-15 19:58:03 | 显示全部楼层
还没用到,先支持了,给力!
回复 支持 反对

使用道具 举报

18

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2013-8-13
在线时间
0 小时
发表于 2014-8-15 21:24:06 | 显示全部楼层
顶一个,哈哈哈,后面有空在一下
要么不做,要么做到最好。。
回复 支持 反对

使用道具 举报

14

主题

191

帖子

0

精华

QQ游客

积分
813
金钱
813
注册时间
2013-6-9
在线时间
181 小时
发表于 2014-8-15 22:01:00 | 显示全部楼层
楼主发了不少好帖子,对我等初学者很有用,顶一下。
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2014-6-27
在线时间
125 小时
发表于 2014-8-16 08:24:21 | 显示全部楼层

给力 下来好好琢磨琢磨

回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-16 09:06:28 | 显示全部楼层
回复【31楼】Admin:
---------------------------------
欢迎版主光临指导
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2014-8-16 20:49:36 | 显示全部楼层
回复【8楼】Badu_Space:
---------------------------------
我的战舰是2.8寸,下载试了,可能是屏大小的原因,显示不全面。挺好的!我觉得,看懂并消化这个例程,能提升很多。
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-17 13:29:17 | 显示全部楼层
回复【37楼】wangyan915205:
---------------------------------
谢谢捧场!!!

2.8的确显示不全,将显示比较长的缩短一下即可,或者不想显示的全部干掉也能显示完,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-8-18 18:05:55 | 显示全部楼层
回复【30楼】Badu_Space:
---------------------------------
没找到是哪个标志位。
我的硬件是DM DP和电脑直连,没有用三极管做开关。如果STM32 usb连接后 USB被拔掉了相应标志位会改变吗?
usb会定时去握手检测连接状态?如果没有是不是要自己“重启”STM32的USB模块再去读相应的标志位检测连接状态?这样如果我只是想知道固定的上位机有没有连接可以定时握手来检查连接。毕竟现在通讯是正常的,我不想搞太多飞机。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-18 19:22:57 | 显示全部楼层
回复【39楼】ArchiChain:
---------------------------------
回去看看,有个标志直接可以读取的,记得
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

9

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2014-7-18
在线时间
0 小时
发表于 2014-8-18 23:14:34 | 显示全部楼层
感谢分享!!!!
Stm32 F0/F103
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-19 08:10:36 | 显示全部楼层
回复【39楼】ArchiChain:
---------------------------------
http://www.openedv.com/posts/list/27484.htm这里,可以看看这个例程,里面有这么一句话if(bDeviceState == CONFIGURED)
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-8-19 10:05:31 | 显示全部楼层
回复【42楼】Badu_Space:
---------------------------------
好的,谢谢!我去马上去试试热拔插USB这个位置有没有变化化。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-8-19 10:30:24 | 显示全部楼层
回复【42楼】Badu_Space:
---------------------------------
谢谢了,仿真发现这个标志位热拔插不会改变,只有第一次连接的时候置位了。看来还是得用握手方式确认上位机连接状态。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-19 12:33:47 | 显示全部楼层
回复【44楼】ArchiChain:
---------------------------------
这样啊,也行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-8-19 12:34:09 | 显示全部楼层
回复【44楼】ArchiChain:
---------------------------------
有没试着清除这个标志位?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-8-20 10:53:33 | 显示全部楼层
回复【46楼】Badu_Space:
---------------------------------
你是说定时清掉这个标志位如果有主机连接它还会被枚举置位?不知道清这个会不会导致通讯不正常,HID我移植过几个版本才成功的,现在项目赶时间暂时就不折腾他了,还是定时和上位机握手确认连接先完成工作任务。谢谢。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-9-19 08:15:35 | 显示全部楼层
回复【47楼】ArchiChain:
---------------------------------
//连接指示
if(Divece_STA != bDeviceState) 
{
if(bDeviceState == CONFIGURED) //提示已连接成功
{ LCD_Display_String_BK(60, 223, "USB Connected    ", 16, BLUE, WHITH); }
else //提示已经断开连接
{ LCD_Display_String_BK(60, 223, "USB DisConnected ", 16, RED, WHITH); }

Divece_STA = bDeviceState; //记录USB设备状态
}

代码中这个bDeviceState标志位会改变吧,我在板子上面直接就是判断这个标志位来定USB是否连接上的,如果插拔这个标志位都不变的话,我上面的两句提示就必会切换了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-9-19 12:33:36 | 显示全部楼层
回复【48楼】Badu_Space:
---------------------------------
谢谢你还记得这事,我当时好像发现这个标志位第一次连接电脑被枚举置位后如果断开usb线不会复位,所以不能在中途判断连接是否存在。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-9-19 12:59:25 | 显示全部楼层
回复【49楼】ArchiChain:
---------------------------------
USB寄存器好像有个标志位,你可以读取一下,判断是否连接上,没有的话你就清除即可,或者修改USB底层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 07:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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