(转)单片机/嵌入式上位机编程工具哪个好用?

admin 发表了文章 • 5 个评论 • 2407 次浏览 • 2015-01-20 21:29 • 来自相关话题

目前用在单片机嵌入式上位机编程的开发工具有很多,让很多刚入门的工程师们无所适从。那么用来编写单片机嵌入式上位机的工具有那几款呢?
(1)LabVIEW:是NI推出的,和C和BASIC开发环境类似,但是LabVIEW与其他计算机语言有很大区别,其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。特点是:采用了通用的硬件,可以通过改变软件在计算机上实现多种仪器的功能。被公认为测试之王。
(2)VB:是由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

(3)VS:它是微软提供的一个工具集,由各种各样的工具组成。VS可以支持C/C++、VB、JAVA、C#编程。然了一次只能支持一种编程方式。在VS安装完成,第一次运行的时候会让你选择常用语言,如果你选择C/C++,那么他就成了能够进行C/C++编程的平台也许就是你所说的VC了。如果不想用C/C++的话,只需要修改一下他的初始化设置,选择别的编程语言,就成为了另一种的语言的编程环境了。所以总的来说它是一个集成平台。

(4)VC:是微软的C++开发工具,有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++有便利的除错工具,特别是包含了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架,开发速度比较快。

(5)Delphi:是一个集成开发环境(IDE),使用的核心是由传统Pascal语言发展而来的Object Pascal,以图形用户界面为开发环境,透过IDE、VCL工具与编译器,配合连结数据库的功能,构成一个以面向对象程序设计为中心的应用程序开发工具。似乎很多人都觉得Delphi已经没落了、过时了,好多人都没听过Delphi。但我不这么认为。“真正的程序员用c,聪明的程序员用Delphi”这句话是对Delphi最经典、最实在的描述。

(6)C#:是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。 应该是最近几年应用比较多的,为什么?因为太简单,很多功能拖个控件就搞定;

(7)JAVA:具有卓越的通用性、高效性、平台移植性和安全性。关于JAVA小编就不多说了,小编本身对其也不熟悉。留待各位大侠点评。

上面讲到的几种开发工具可谓各有千秋,上面只是做了一个列举和简要说明,并加了一些个人粗浅的看法。你们觉得那一款更好用呢?它的优点在哪里?未来会否会出现大一统的格局,有一款或几款工具能成为绝对的主导?你觉得谁会胜出?为什么?

转自:http://www.eefocus.com/embedded/335314 查看全部
目前用在单片机嵌入式上位机编程的开发工具有很多,让很多刚入门的工程师们无所适从。那么用来编写单片机嵌入式上位机的工具有那几款呢?
(1)LabVIEW:是NI推出的,和C和BASIC开发环境类似,但是LabVIEW与其他计算机语言有很大区别,其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。特点是:采用了通用的硬件,可以通过改变软件在计算机上实现多种仪器的功能。被公认为测试之王。
(2)VB:是由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

(3)VS:它是微软提供的一个工具集,由各种各样的工具组成。VS可以支持C/C++、VB、JAVA、C#编程。然了一次只能支持一种编程方式。在VS安装完成,第一次运行的时候会让你选择常用语言,如果你选择C/C++,那么他就成了能够进行C/C++编程的平台也许就是你所说的VC了。如果不想用C/C++的话,只需要修改一下他的初始化设置,选择别的编程语言,就成为了另一种的语言的编程环境了。所以总的来说它是一个集成平台。

(4)VC:是微软的C++开发工具,有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++有便利的除错工具,特别是包含了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架,开发速度比较快。

(5)Delphi:是一个集成开发环境(IDE),使用的核心是由传统Pascal语言发展而来的Object Pascal,以图形用户界面为开发环境,透过IDE、VCL工具与编译器,配合连结数据库的功能,构成一个以面向对象程序设计为中心的应用程序开发工具。似乎很多人都觉得Delphi已经没落了、过时了,好多人都没听过Delphi。但我不这么认为。“真正的程序员用c,聪明的程序员用Delphi”这句话是对Delphi最经典、最实在的描述。

(6)C#:是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。 应该是最近几年应用比较多的,为什么?因为太简单,很多功能拖个控件就搞定;

(7)JAVA:具有卓越的通用性、高效性、平台移植性和安全性。关于JAVA小编就不多说了,小编本身对其也不熟悉。留待各位大侠点评。

上面讲到的几种开发工具可谓各有千秋,上面只是做了一个列举和简要说明,并加了一些个人粗浅的看法。你们觉得那一款更好用呢?它的优点在哪里?未来会否会出现大一统的格局,有一款或几款工具能成为绝对的主导?你觉得谁会胜出?为什么?

转自:http://www.eefocus.com/embedded/335314

用Cube生成的代码,不会进入中断怎么办?

admin 回复了问题 • 3 人关注 • 6 个回复 • 3614 次浏览 • 2015-01-13 20:47 • 来自相关话题

探讨下我对于modbus的一些理解,移植并不难,modbus的原理

回复

admin 回复了问题 • 4 人关注 • 1 个回复 • 3623 次浏览 • 2015-01-13 17:24 • 来自相关话题

有哪个用cube搞定NAND的flash操作了?头大,求方法或程序......

admin 回复了问题 • 2 人关注 • 3 个回复 • 4646 次浏览 • 2015-01-06 10:28 • 来自相关话题

关于看门狗WWDG的一些东西.(过年了,整些简单的吧)

回复

admin 回复了问题 • 2 人关注 • 3 个回复 • 4574 次浏览 • 2014-12-31 11:20 • 来自相关话题

您好,您最近有没有研究用Cube配置以太网通信呢

lx09110718 回复了问题 • 2 人关注 • 3 个回复 • 2198 次浏览 • 2014-12-31 10:19 • 来自相关话题

今天看到一个有趣的问题,如图所示,怎么样判断是哪个按键产生的中断呢?你知道吗

admin 发表了文章 • 1 个评论 • 2084 次浏览 • 2014-12-23 20:51 • 来自相关话题

很有意思的一个问题
如下图所示
图中红色框中共有五处管脚,分别是
PC13 , PE13 , PB13 , PD13 , PA13
框框中的几个管脚都是对应的相同的外部中断EXIT13
问题是:
当这几个管脚都分别接一个按钮开关用来做外部中断判断,
做判断后分别用来点亮不同的LED灯.
那么问题来了:
相同的中断怎么去判断究竟是哪个管脚的开关被按下导致的呢?

你知道答案吗?
欢迎讨论 查看全部
很有意思的一个问题
如下图所示
图中红色框中共有五处管脚,分别是
PC13 , PE13 , PB13 , PD13 , PA13
框框中的几个管脚都是对应的相同的外部中断EXIT13
问题是:
当这几个管脚都分别接一个按钮开关用来做外部中断判断,
做判断后分别用来点亮不同的LED灯.
那么问题来了:
相同的中断怎么去判断究竟是哪个管脚的开关被按下导致的呢?

你知道答案吗?
欢迎讨论

d8ce9dd68a77b31e6c044f4c8ea91b60.png

cubemax使用stm32f103vb创建简单的led例程错误

codesys 回复了问题 • 3 人关注 • 2 个回复 • 2742 次浏览 • 2014-12-21 10:48 • 来自相关话题

有谁用cube做过CAN实验,遇到了一些问题需要请教一下~

admin 回复了问题 • 3 人关注 • 2 个回复 • 2937 次浏览 • 2014-12-19 12:58 • 来自相关话题

关于串口中断的使用

admin 回复了问题 • 1 人关注 • 2 个回复 • 2570 次浏览 • 2014-12-19 09:01 • 来自相关话题

stm32 F407, 用Cube做以太网通信不成功,请指教

admin 回复了问题 • 5 人关注 • 1 个回复 • 6081 次浏览 • 2014-12-12 16:42 • 来自相关话题

为什么fsmc控制nand,将时间都调到最大了,写入数据后读出来还是不一样啊?

回复

admin 回复了问题 • 1 人关注 • 1 个回复 • 3913 次浏览 • 2014-10-31 17:27 • 来自相关话题

谈谈关于红外遥控接收程序的疑问?看到都在用中断处理,延时等待检测,没有效率可言

回复

admin 发起了问题 • 2 人关注 • 0 个回复 • 2923 次浏览 • 2014-10-14 00:24 • 来自相关话题

关于HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)的研究

admin 发表了文章 • 10 个评论 • 12637 次浏览 • 2014-10-14 00:19 • 来自相关话题

HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)
从它的函数内容考看,其实就是初始化了下uart端口,定义了下接收到的数据的缓存器名,还有定义了接收尺寸,然后开启了UART_IT_RXNE,即接收非空中断,然后静等中断发生。
2楼继续。

中断发生后。
进入
void USART1_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
HAL_UART_IRQHandler(&huart1);
// cont_uart++;
}
先清除等待标志,后进入中断处理
进入
tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);
tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);
/ UART in mode Receiver ---------------------------------------------------/
if((tmp1 != RESET) && (tmp2 != RESET))
{
UART_Receive_IT(huart);
}
判断接收到非空数据,并且RXEN中断开启了,则执行数据接收UART_Receive_IT(huart);
8位,none,所以执行
if(huart->Init.Parity == UART_PARITY_NONE)
{
*huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
}
得到数据,存到pRxBuffPtr的指向地址缓存器里
3楼继续

接上面
if(--huart->RxXferCount == 0)
{
__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

/ Check if a transmit process is ongoing or not /
if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
{
huart->State = HAL_UART_STATE_BUSY_TX;
}
else
{
/ Disable the UART Parity Error Interrupt /
__HAL_UART_DISABLE_IT(huart, UART_IT_PE);

/ Disable the UART Error Interrupt: (Frame error, noise error, overrun error) /
__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

huart->State = HAL_UART_STATE_READY;
}
HAL_UART_RxCpltCallback(huart);

return HAL_OK;
}
计数自减1,判断是否是0,不是0则说明还么接收完
则程序返回,再次接收到一个字节,产生中断再次执行。
直到--huart->RxXferCount == 0
__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); 关闭RXEN接收非空中断
再判断是否在传送,没有则关闭UART Parity Error Interrupt
关闭UART Error Interrupt: (Frame error, noise error, overrun error)
并且 调用接收完成回调函数,HAL_UART_RxCpltCallback(huart);
继续接4楼

接楼上
说明每次接收完数据,只要没发送状态
uart的接收中断全部关闭了,要想连续的接收数据,则需要在
HAL_UART_RxCpltCallback(huart);函数中开启RXEN中断

/ Enable the UART Parity Error Interrupt /
__HAL_UART_ENABLE_IT(huart, UART_IT_PE);

/ Enable the UART Error Interrupt: (Frame error, noise error, overrun error) /
__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);

/ Process Unlocked /
__HAL_UNLOCK(huart);

/ Enable the UART Data Register not empty Interrupt /
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);

即需要再次调用HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);函数,。
下面测试:
在main中添加
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);

}
测试失败,第一次能接收到,第二次数据接收不到。
将 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);写入到
void USART1_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);
cont_uart++;
}
测试成功,可以接收到8位数据。
不过,如果数据超过8位,则超过部分会覆盖掉以前的数据
如:8位数据是,1、2、3、4、5、6、7、8
发送的10位数据:则接收到的会把前两位覆盖,最终接收的数据是
10、9、3、4、5、6、7、8
测试代码是接收8位,要改成10位同样道理,反正超过了接收的就是不对的数据

分析上面的
void USART1_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);
cont_uart++;
}
接收到小于设定的长度值无所谓,能正常获取
大于之后覆盖
因为接收完8个数据,清除中断,然后Hal_ready = ok,等到第九个数据过来产生中断 查看全部
HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)
从它的函数内容考看,其实就是初始化了下uart端口,定义了下接收到的数据的缓存器名,还有定义了接收尺寸,然后开启了UART_IT_RXNE,即接收非空中断,然后静等中断发生。
2楼继续。

中断发生后。
进入
void USART1_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
HAL_UART_IRQHandler(&huart1);
// cont_uart++;
}
先清除等待标志,后进入中断处理
进入
tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);
tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);
/ UART in mode Receiver ---------------------------------------------------/
if((tmp1 != RESET) && (tmp2 != RESET))
{
UART_Receive_IT(huart);
}
判断接收到非空数据,并且RXEN中断开启了,则执行数据接收UART_Receive_IT(huart);
8位,none,所以执行
if(huart->Init.Parity == UART_PARITY_NONE)
{
*huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
}
得到数据,存到pRxBuffPtr的指向地址缓存器里
3楼继续

接上面
if(--huart->RxXferCount == 0)
{
__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);

/ Check if a transmit process is ongoing or not /
if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
{
huart->State = HAL_UART_STATE_BUSY_TX;
}
else
{
/ Disable the UART Parity Error Interrupt /
__HAL_UART_DISABLE_IT(huart, UART_IT_PE);

/ Disable the UART Error Interrupt: (Frame error, noise error, overrun error) /
__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

huart->State = HAL_UART_STATE_READY;
}
HAL_UART_RxCpltCallback(huart);

return HAL_OK;
}
计数自减1,判断是否是0,不是0则说明还么接收完
则程序返回,再次接收到一个字节,产生中断再次执行。
直到--huart->RxXferCount == 0
__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); 关闭RXEN接收非空中断
再判断是否在传送,没有则关闭UART Parity Error Interrupt
关闭UART Error Interrupt: (Frame error, noise error, overrun error)
并且 调用接收完成回调函数,HAL_UART_RxCpltCallback(huart);
继续接4楼

接楼上
说明每次接收完数据,只要没发送状态
uart的接收中断全部关闭了,要想连续的接收数据,则需要在
HAL_UART_RxCpltCallback(huart);函数中开启RXEN中断

/ Enable the UART Parity Error Interrupt /
__HAL_UART_ENABLE_IT(huart, UART_IT_PE);

/ Enable the UART Error Interrupt: (Frame error, noise error, overrun error) /
__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);

/ Process Unlocked /
__HAL_UNLOCK(huart);

/ Enable the UART Data Register not empty Interrupt /
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);

即需要再次调用HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);函数,。
下面测试:
在main中添加
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);

}
测试失败,第一次能接收到,第二次数据接收不到。
将 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);写入到
void USART1_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);
cont_uart++;
}
测试成功,可以接收到8位数据。
不过,如果数据超过8位,则超过部分会覆盖掉以前的数据
如:8位数据是,1、2、3、4、5、6、7、8
发送的10位数据:则接收到的会把前两位覆盖,最终接收的数据是
10、9、3、4、5、6、7、8
测试代码是接收8位,要改成10位同样道理,反正超过了接收的就是不对的数据

分析上面的
void USART1_IRQHandler(void)
{
HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 8);
cont_uart++;
}
接收到小于设定的长度值无所谓,能正常获取
大于之后覆盖
因为接收完8个数据,清除中断,然后Hal_ready = ok,等到第九个数据过来产生中断

关于RS485通讯的问题,有几个问题请大家给指教啊,越详细越好

回复

admin 回复了问题 • 1 人关注 • 2 个回复 • 2897 次浏览 • 2014-10-13 23:52 • 来自相关话题