搜索
bottom↓
楼主: linquan315

STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)(申请加酷,让更多的人

  [复制链接]

出0入0汤圆

发表于 2012-7-11 11:44:35 | 显示全部楼层
现在发现自己弄的串口只是皮毛啊!

出0入0汤圆

发表于 2012-7-12 22:01:21 | 显示全部楼层
写得不错 学习一下

出0入0汤圆

发表于 2012-7-12 22:08:16 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2012-7-13 08:51:59 | 显示全部楼层
好贴~!

出0入0汤圆

发表于 2012-7-13 14:22:17 | 显示全部楼层
很强大,学习

出0入0汤圆

发表于 2012-7-13 14:58:49 | 显示全部楼层
技术分享帖,感谢楼主。

出0入0汤圆

发表于 2012-7-13 16:38:09 | 显示全部楼层
将这1000个数据写入发送缓冲区以后,启动发送。在115200的波特率,一位起始位,一位停止位,无校验位的情况下,至少需要(10*1000*2)/115200=0.1736秒

请问这里为什么要“*2”??

出0入4汤圆

发表于 2012-7-13 18:40:41 | 显示全部楼层
看了看。

出0入0汤圆

发表于 2012-7-15 16:52:00 | 显示全部楼层
这是我见过串口驱动最专业的文章。
人人都会用串口,但是大部分串口的驱动不堪入目,效率低下。

出0入0汤圆

发表于 2012-7-22 22:09:42 | 显示全部楼层
   非常好的STM32串口驱动

出0入0汤圆

发表于 2012-7-22 23:45:14 | 显示全部楼层
狂顶,以后用得上的,真心觉得写的很好

出0入0汤圆

发表于 2012-8-12 18:49:51 | 显示全部楼层
向楼主致敬~!

出0入0汤圆

发表于 2012-8-12 23:45:59 | 显示全部楼层
循环学习;谢谢

出0入0汤圆

发表于 2012-8-13 23:45:28 | 显示全部楼层
mark一下,方便以后使用

出0入0汤圆

发表于 2012-8-14 01:22:11 来自手机 | 显示全部楼层
mark      

出0入24汤圆

发表于 2012-8-14 09:05:36 | 显示全部楼层
学习一下思路,感谢楼主

出0入0汤圆

发表于 2012-8-14 10:41:00 | 显示全部楼层
感谢分享,学习

出0入0汤圆

发表于 2012-8-14 10:46:35 | 显示全部楼层
好文章都是要mark的

出0入0汤圆

发表于 2012-8-15 13:13:55 | 显示全部楼层
顶~~~

出0入0汤圆

发表于 2012-8-15 18:07:53 | 显示全部楼层
stm32 串口 mark之
头像被屏蔽

出0入0汤圆

发表于 2012-8-16 07:46:52 | 显示全部楼层
不错,好

出0入0汤圆

发表于 2012-8-16 09:01:57 | 显示全部楼层
新手,先留着啊

出0入0汤圆

发表于 2012-8-16 09:32:25 | 显示全部楼层
这个向前辈们学习了

出0入53汤圆

发表于 2012-8-17 10:08:21 | 显示全部楼层
楼主写的太好了

出0入0汤圆

发表于 2012-8-23 09:50:16 | 显示全部楼层
嗯,写的很不错
~

出0入0汤圆

发表于 2012-8-23 10:39:37 | 显示全部楼层
MARK,很详细,很有用

出0入0汤圆

发表于 2012-8-23 14:13:13 | 显示全部楼层
我也来顶一下

出0入0汤圆

发表于 2012-8-23 14:27:20 | 显示全部楼层
学习了!!

出0入0汤圆

发表于 2012-8-23 14:39:07 | 显示全部楼层
MARK                        

出0入0汤圆

发表于 2012-8-23 22:36:12 | 显示全部楼层
好东西,找个时间好好学习一下!
头像被屏蔽

出0入0汤圆

发表于 2012-8-29 14:28:07 | 显示全部楼层
mark一下 好东西

出0入0汤圆

发表于 2012-9-12 00:23:40 | 显示全部楼层
请教一下,问什么在void USART1_IRQHandler(void)串口中断函数中设置一个静态变量        static u8 Flag=0;
是为了屏蔽掉串口第一进入中断吗?

出0入0汤圆

发表于 2012-9-13 16:26:48 | 显示全部楼层
感谢楼主的分享精神

出0入0汤圆

发表于 2012-9-13 16:45:02 | 显示全部楼层
"只需将USART1.c,和USART1Config.c中的‘USART1’直接全部替换成‘USART2’,等等就可以了".........

看到这句话,这真的是一个合格的驱动么。。。。

再加上动态内存分配,我如果开两个串口,会不会有函数可重入的问题呢

我实在想不通,一个什么样的mcu项目,需要一个动态内存分配的usart驱动,有这些存放控制块链表的内存空间,不如直接开个静态的环形缓冲了,完全静态的内存分配,算法简单可靠,只要合理锁定中断,不存在溢出风险,何乐不为呢?


出0入0汤圆

发表于 2012-9-13 17:51:40 | 显示全部楼层
kool  值得研究

出0入0汤圆

发表于 2012-9-13 19:58:29 | 显示全部楼层
MARK         

出0入0汤圆

发表于 2012-9-13 20:39:12 | 显示全部楼层
很好,mark

出0入0汤圆

发表于 2012-9-13 22:22:17 | 显示全部楼层
这么长,慢慢看

出0入53汤圆

发表于 2012-9-24 10:06:11 | 显示全部楼层
不错值得学习

出0入0汤圆

发表于 2012-9-24 11:24:19 | 显示全部楼层
mark  学习了

出0入0汤圆

发表于 2012-9-24 12:57:52 | 显示全部楼层

出100入18汤圆

发表于 2012-9-24 13:18:21 | 显示全部楼层
很好,很详细,学习了!

出0入0汤圆

发表于 2012-9-24 23:37:50 | 显示全部楼层
调试通过。运行良好。不过lz的代码风格够乱的……  为毛不直接copy ucos的os_mem.c 呢? 何必呢……

出0入0汤圆

发表于 2012-9-25 07:20:44 | 显示全部楼层
这个要看看,学习学习

出0入0汤圆

发表于 2012-9-25 08:23:09 | 显示全部楼层
好强! 学习来了! 谢谢分享!

出0入0汤圆

发表于 2012-9-25 09:04:09 | 显示全部楼层
cool                                                                                                      

出0入0汤圆

发表于 2012-9-25 16:58:54 | 显示全部楼层
顶一下楼主,好帖

出0入0汤圆

发表于 2012-9-27 23:44:38 | 显示全部楼层
mark,现在才看到这么经典的帖子啊!

出0入0汤圆

发表于 2012-9-28 00:17:30 | 显示全部楼层
学习了  串口

出0入0汤圆

发表于 2012-9-28 08:55:11 | 显示全部楼层
       海量数据传输是要考虑效率的问题,谢谢楼主的讲解!

出0入0汤圆

发表于 2012-9-28 17:52:45 | 显示全部楼层
好贴,今天断断续续看了一天,受益匪浅

出0入0汤圆

发表于 2012-10-10 08:49:49 | 显示全部楼层
不错,很难找到像这样完整,实用的例子

出0入0汤圆

发表于 2012-10-14 10:27:04 | 显示全部楼层
这篇真的不错

出30入0汤圆

 楼主| 发表于 2012-10-19 22:15:19 | 显示全部楼层
xiaoshidu 发表于 2012-9-12 00:23
请教一下,问什么在void USART1_IRQHandler(void)串口中断函数中设置一个静态变量        static u8 Flag=0;
是为 ...

是的,发送只有一个寄存器空的中断,第一次打开以后就会进一次中断,这时并没有数据的。以前写的健壮性不好,若异常的时候进中断是灾难性的,现在更新了。

出0入0汤圆

发表于 2012-10-20 14:13:00 | 显示全部楼层
学习了!!!!!!!!!!!!!!

出0入0汤圆

发表于 2012-10-23 14:12:37 | 显示全部楼层
此贴必须得力挺、、

出0入0汤圆

发表于 2012-10-23 23:20:54 | 显示全部楼层
相当棒。这种思路非常需要学习的。

出0入0汤圆

发表于 2012-10-24 00:35:15 | 显示全部楼层
顶楼主……楼主的代码风格比较赞。

出0入0汤圆

发表于 2012-10-24 20:06:01 | 显示全部楼层
在移植时,老是指示一大堆 函数的原型没有申明的警告,不知大家在移植时有没有发现,特别是usart 和 usartconfig中的函数相互调用都没有原型申明

出0入0汤圆

发表于 2012-10-24 21:50:51 | 显示全部楼层
cool            

出0入0汤圆

发表于 2012-10-24 22:26:11 | 显示全部楼层
很不错啊

出0入0汤圆

发表于 2012-10-25 00:58:00 | 显示全部楼层
收了,后面一定能用得到.

出0入0汤圆

发表于 2012-10-25 01:18:19 | 显示全部楼层
再顶上一次,好贴

出0入0汤圆

发表于 2012-10-27 10:09:35 | 显示全部楼层
    mark

出0入0汤圆

发表于 2012-10-27 10:40:29 | 显示全部楼层
mark        

出0入0汤圆

发表于 2012-10-28 13:19:01 | 显示全部楼层
我的神,太有用了,谢谢楼主的杰出贡献。

出0入0汤圆

发表于 2012-10-28 14:02:39 | 显示全部楼层
谢谢分享,楼主的内存动态分配和UCOS类似,弱弱的请教一下楼主。
如果使用UCOS的话(不使用的话,将内存管理函数移植出来),直接使用自带的内存管理就可以实现,貌似不用搞成环形队列,
(1)串口发送以前计算需要的内存块数,然后申请内存块,启动DMA。当然也需要一个指针数组来指向申请的内存块。
(2)DMA每用完一个内存块,换给内存分区,内存管理函数可以将其自动加入到空闲块里面,然后更新空闲块链表。
       这样内存块就能及时的释放,从而得到有效的利用。

  所以我觉得使用UCOS的内存管理函数的话,直接用一个指针数据代替环形队列就可以了。

出0入0汤圆

发表于 2012-10-29 16:38:29 | 显示全部楼层
顶一顶

出30入0汤圆

 楼主| 发表于 2012-11-3 19:59:19 | 显示全部楼层
mcusun2000 发表于 2012-10-24 20:06
在移植时,老是指示一大堆 函数的原型没有申明的警告,不知大家在移植时有没有发现,特别是usart 和 usartc ...

usart.h中没有对函数进行声明,所以会报错,呵呵,但是不影响使用。以前在学校写的代码,没有考虑那么多啦。

出30入0汤圆

 楼主| 发表于 2012-11-3 20:08:21 | 显示全部楼层
Eric2013 发表于 2012-10-28 14:02
谢谢分享,楼主的内存动态分配和UCOS类似,弱弱的请教一下楼主。
如果使用UCOS的话(不使用的话,将内存管理 ...

谢谢批评指教啦~~
当时我的项目里除了用到这个ST的以外,还有mega128、mega16以及C8051Fxx系列的单片机啊,跑不了系统的。为了兼容不带系统、没有那么多资源的单片机才这么做的。你说的很对,其实我的那些内存分配和环形队列就是为了实现你后面说的的这些功能。但是你的那个指针数组必须是环线的啊,其实是一样的。

出0入0汤圆

发表于 2012-11-3 22:50:18 | 显示全部楼层
确实不错

出0入0汤圆

发表于 2012-11-4 09:18:42 | 显示全部楼层
linquan315 发表于 2012-11-3 20:08
谢谢批评指教啦~~
当时我的项目里除了用到这个ST的以外,还有mega128、mega16以及C8051Fxx系列的单片机啊 ...

楼主居然回复了,受宠若惊啊,呵呵,还是非常感谢楼主分享的好东西。

出0入0汤圆

发表于 2012-11-4 21:04:46 | 显示全部楼层
MARK               

出0入0汤圆

发表于 2012-11-4 21:31:18 | 显示全部楼层
写得不错 学习一下

出0入0汤圆

发表于 2012-11-5 15:41:00 | 显示全部楼层
学习 !!!!!!!!!

出0入0汤圆

发表于 2012-11-6 20:20:04 | 显示全部楼层
太感谢了,正在愁呢,没思路,现在得到了个启发,谢谢

出0入0汤圆

发表于 2012-11-6 22:45:04 | 显示全部楼层
层次太高了,看不懂,但是楼主的学习态度非常值得我学习

出0入0汤圆

发表于 2012-11-6 22:55:16 | 显示全部楼层
学习        记着

出0入0汤圆

发表于 2012-11-6 23:30:12 | 显示全部楼层
MARK 向学长学习了

出0入0汤圆

发表于 2012-11-13 15:32:59 | 显示全部楼层
谢谢分享 很好的资料

出0入0汤圆

发表于 2012-11-18 08:44:48 | 显示全部楼层
谢谢分享,写得很不错。

出30入0汤圆

 楼主| 发表于 2012-11-18 23:17:44 | 显示全部楼层
本帖最后由 linquan315 于 2012-11-18 23:20 编辑

<一>CAN收发+动态内存+环形队列库的使用方法
闲话少说,最近一个信号采集板要使用CAN总线,LPC1754的平台,移植了这个功能。
首先介绍使用方法,很简单,只有三步:
1:工程中包含这几个函数

2:配置发送、接收缓冲区的大小
//定义CAN缓冲区的大小                               
#define     OS_MEM_CAN1_MAX          1024                             //CAN缓冲区的内存大小
#define     OS_MEM_CAN1_BLK          16                                      //每一个块的长度
#define     CAN1_SEND_MAX_Q          (OS_MEM_CAN1_BLK-4)   //CAN内存块内最大空间
#define     CAN1_SEND_MAX_BOX        (OS_MEM_CAN1_MAX/OS_MEM_CAN1_BLK)        
//CAN一共有CAN1_SEND_MAX_BOX个BOX
#define     CAN1_RECV_MAX_BOX        (OS_MEM_CAN1_MAX/OS_MEM_CAN1_BLK)       
//CAN一共有CAN1_RECV_MAX_BOX个BOX
直接按照默认配置就可以了,需要自己配置的只用配置前面两个参数就可以了。
想弄明白的这里解释一下,OS_MEM_CAN1_MAX是定义缓冲区的大小,是数据缓冲区,也即是这里不会存放CAN协议帧的ID啊、类型啊、数据量啊什么的,只放数据,OS_MEM_CAN1_BLK是指每一个内存块内最多可以存放多少数据,由于内存块的前面四个字节已经被用作单向链表的地址了,所以实际可以用的是CAN1_SEND_MAX_Q,即(OS_MEM_CAN1_BLK-4)。第三个宏定义CAN1_SEND_MAX_Q就不用管啦,因为8位、16位有可能只用两个字节作链表地址,这里为了版本兼容。最后两个是发送、接收缓冲区的大小,也不用管了,已经通过前面的值算出来了。
3:调用初始化函数与应用函数
初始化函数
CAN1_Configuration(0, BPS_1000K);  /* 初始化第1路CAN,波特率1000K  */
发送函数:
CAN1WriteDataToBuffer(buffer, num, ID, ff, mbox, chl)  /* 注释见函数说明 */
接收函数:
CAN1RecvFun()                                    /* 注释见函数说明 */
/*******************************************************************************
* 文件名         : CAN1WriteDataToBuffer
* 描述           : 检查发送缓冲区的大小,若空间足够,将待发送的数据放入到发送缓冲
                   区中去,并且启动发送
* 输入           : buffer待发送的数据的指针,num待发送的数据的数量,ID:CAN帧的ID号
                            ff:ID类型,0代表11位模式,1代表29位模式,mbox:CAN发送邮箱,有三个
                            对应1,2,3,chl: CAN通道,LPC1754一共两个,CAN通道0与通道1
* 输出           : 无
* 返回           : 若正确放入到发送缓冲区中去了,就返回0x00 ,否则返回0x01
*******************************************************************************/
CAN1WriteDataToBuffer(buffer, num, ID, ff, mbox, chl)
/*******************************************************************************
* 文件名         : CAN1RecvFun
* 描述           : 当接收到完整的一帧数据以后的处理函数,这个函数是用户的接口函数
                                CAN1QRecvTest中存放最近一次接收的CAN数据包,用户可以使用。
* 输入           : 无
* 输出           : 无
* 返回           : 无
*******************************************************************************/
CAN1RecvFun()
    OK,所有的使用方法就这些了。

<二>CAN总线的简单介绍
CAN的好处就不用说了,抛开繁琐的官方介绍不讲,看看下图,只需要两根线,就可以将110个设备挂在总线上,最远的通信距离能够达到15Km,而且可靠性、速度都比较优异。可以说CAN总线是设备互联和组网的理想选择。

正是如此,CAN总线在大量应用在的工控、自动化、航空、安全领域。

有的人可能会以为,相对485+Modbus而言,CAN总线的成本比较高,其实不然。现在的微控制器的成本已经大大降低了,一般50-100M左右的Cortex-M0、Cortex-M3都是非常低廉,一般只有8-20元左右,内部资源较丰富,至少也有128KFlash,20K以上的RAM,内部资源十分丰富。CAN总线自然不在话下,所以笔者十分推崇使用低成本的ARM+开源操作系统+CAN总线的模式,可以大大减少软件的开发时间。随着技术的发展,集成电路的功能越来越集成化,硬件设计越来越傻瓜化,开发人员将大量的精力朝软件方向偏移。
笔者在读书的过程中,经常见到有的人使用51+汇编,或者使用Cortex-M3处理器,自己编写库文件。笔者觉得在技术日新月异的今天,抱残守缺不如与时俱进。
一些朋友不理解,为什么一个收发程序要写的那么复杂,其实呢,我是想把软件架构写简单一点的,当时是考虑USART.C或者CAN.C是与硬件无关的,而USARTConfig.C、CANConfig.C是与硬件相关的,在任何平台上USART.C、CAN.C都是一模一样的,用户只需要实现几个简单的配置函数就可以实现移植,不管是用8、16、32位,还是上千种各种厂商生产的微控制器,还是IIC、SPI、IIS、USART、CAN、IrDon还是单总线,都可以使用这个结构。
CAN每一个数据帧的结构如上图所示,前面说CAN总线可以使多主模式,其实准确来说,同时只能有一个主机。CAN总线上有很多设备,它们之间是相互独立的,只有两条数据线,当总线上有两个甚至更多设备同时通信的时候,有一套机制保证它们不会相互干扰。CAN的基本信元是一个显性电平和隐性电平,显性是0,隐性是1,很好理解,当一个1与一个0相与的时候,就会变成0了。当大家都在通信的时候,在帧的ID阶段,就在竞争谁能抢得总线的占有权,CAN的收发器管脚在输出电平的时候,也在检测该管脚上的电平值,当我输出一个隐性电平(逻辑1,高电平),但是总线上有其他设备和我竞争,此时它输出的是一个显性电平(逻辑0,低电平),总线上的电平被拉成了显性电平(逻辑0,低电平),这时,总线检测到了输出与输入状态不一致,就会自动退出总线占用权的竞争。


  1:使用LPC1754的CAN发送数据的时候,只有3个缓冲区,也就是说,当我们把数据写入到发送缓冲区中时,如果此时CAN总线上面有其他数据,且ID比当前任务的ID值优先级要高,那么这个数据暂时是发送不出去的。只有当总线空闲的时候,该数据才能够发送出去。所以CAN总线的发送邮箱一般有几个,(汽车级或者安全等级更高的微控制器更多,例如Infineon的XC2000系列、TI的安全控制器TMS570系列就有多达128个收发邮箱甚至更多)。
如果使用本收发例程,可以实现发送缓冲区可配置的功能,也就是可以定义这个发送缓冲区的大小,这就先进了很多。打个比方,如果现在CAN总线的负载率很高,我现在要发送一包数据出去,但是由于这个包的ID优先级不高,总是抢不到总线的使用权,CPU不用老停在这里等待CAN总线空闲,如果总线上100ms之内都是忙的状态,CPU岂不是要等待100ms,这在嵌入式系统中是不可容忍的。我们将它放入缓冲区,等待总线空闲以后将自动数据发送出去,这就将CPU“解放”出来了。
当然,硬件缓冲区比软件缓冲区要好的多,当缓冲区中有128个待发送的数据包的时候,硬件可以将这么多数据包中最重要的数据优先发送,而软件方式只能按照入栈的先后顺序发送(其实软件也可以做,但是麻烦)。
   2:本例程是在LPC1754下,8M有源晶振,CPU运行在96MHz,CAN模块的时钟为24MHz,使用P0.0\P0.1作为CAN发送、接收管脚。
如果是其他管脚,需要重新配置。
3:本函数是使用中断的方式实现发送和接收,没有也不考虑使用等待和查询的方式,也不打算与这种方式兼容。写入的时间很短,在几个微秒以内,如果需要大量的发送数据,需要将缓冲区设大一点。
为了验证可靠性,作了几组实验,在最极限的情况下,测试是否有问题。
(1)极限发送,在超级循环中让CAN一直在发送数据,将发送缓冲区撑满,数据包ID每次自加1,同时数据包中数据也自加1,早CAN总线负载率为100%的情况下,发送了一个晚上。累计发送75384598帧数据包,数据的大小与ID号以及周立功CAN收发器接受到的数据一致。



(2)极限接收与发送,每10mS发送一次的连续10帧数据,ID自加1,微控制器收到这个数据以后原封发出给周立功CAN收发器。周立功CAN收发器一共发送了100000帧数据,也接收到了100000帧数据,没有错误。

3:使用下述情况进行收发:
A)100K、125K、250K、500K、800K、1000K的波特率的情况下进行发送和接收;
B)标准ID格式与扩展ID格式下的测试;
C)数据包分别为0,1,2,3,4,5,6,7,8的情况下的测试;
D)缓冲区大小分别为128、512、1024情况下的测试;
E)发送缓冲区分别为邮箱1、邮箱2、邮箱3,以及组合使用的情况。
现在我能想到的测试就只有这些了,没有发现问题,可能是没有加上其他负载的情况下,目前我还没有其他的板子,做了实验再挂上。
4:接下来我想测试一下在带上其他负载的情况,可惜现在没有装备,只有等到以后再测了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-28 18:30:43 | 显示全部楼层
学习了,顶起
头像被屏蔽

出0入0汤圆

发表于 2012-11-30 16:24:53 | 显示全部楼层
为什么出现按F12打不开子涵书,我用的是KEIL 4版本的 最新版本 这是为什么呢!

出0入0汤圆

发表于 2012-11-30 17:24:51 | 显示全部楼层
好铁……
头像被屏蔽

出0入0汤圆

发表于 2012-11-30 17:34:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-11-30 17:52:37 | 显示全部楼层
正好最近在搞这个,,,不错,,

出0入0汤圆

发表于 2012-12-5 22:54:29 | 显示全部楼层
Thanks for sharing!

出0入17汤圆

发表于 2012-12-6 11:50:08 | 显示全部楼层
串口程序很强大,下载学习。

出0入0汤圆

发表于 2012-12-6 12:02:17 | 显示全部楼层
牛,顶起了

出0入0汤圆

发表于 2012-12-6 14:16:02 | 显示全部楼层
学习一下,多谢了!!

出0入0汤圆

发表于 2012-12-6 20:00:19 | 显示全部楼层
这个不错,跟链表好像差不多

出0入0汤圆

发表于 2012-12-6 20:08:06 | 显示全部楼层
图文并茂,十分详实。
mark

出0入0汤圆

发表于 2012-12-6 21:11:58 | 显示全部楼层
很好,学习了,谢谢。

出0入0汤圆

发表于 2012-12-8 09:51:23 | 显示全部楼层
mark                 

出0入0汤圆

发表于 2012-12-14 17:08:37 | 显示全部楼层
非常好的资料

出0入0汤圆

发表于 2012-12-14 18:46:01 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2012-12-14 18:51:05 | 显示全部楼层
相当不错,谢谢分享~~~~~~~~~~~

出0入0汤圆

发表于 2012-12-14 18:59:15 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2012-12-19 19:19:10 | 显示全部楼层
真正的牛人呀!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 20:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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