tag 标签: 源代码

相关帖子
相关博文
  • 热度 2
    2024-3-4 10:04
    990 次阅读|
    1 个评论
    嗨,亲爱的工程师、学生和爱好者们,我来啦!欢迎来到神秘的兆易创新 GD32H759I-EVAL 开发板世界!如果你是一位电子工程师或者对魔法般的嵌入式技术感兴趣,那么你来到的地方绝对没错!今天,我们将一起探索一个令人惊叹的【兆易创新 GD32H759I-EVAL 开发板】。防御黑客病毒入侵 AI 自动驾驶公交系统是一个涉及到多个层面,包括硬件安全、操作系统安全、网络通信安全、应用层安全等。下面我将写一个简化的 C 语言程序,用于检测并防御潜在的恶意输入: #include #include #include #include // 假设有一些敏感数据,如公交路线、时间表等 char route = "Route 123"; // 定义字符数组 route 并初始化为 "Route 123" char schedule = "07:00-19:00"; // 定义字符数组 schedule 并初始化为 "07:00-19:00" // 用于模拟黑客攻击的函数 void simulateHackerAttack(char *target) { printf("Hacker trying to access: %s\n", target); // 打印黑客尝试访问的信息 // 这里可以添加模拟黑客攻击的代码,如尝试解密、篡改数据等 } // 检查输入是否安全的函数 int isInputSafe(char *input) { // 检查输入是否包含非法字符或恶意代码 // 这里只是一个简单的示例,实际应用中需要更复杂的检查 for (int i = 0; i < strlen(input); i++) { if (input 126) { // 如果字符的 ASCII 值不在 32-126 之间,认为是非法字符 return 0; // 输入包含非法字符,返回 0 表示不安全 } } return 1; // 输入安全,返回 1 } int main() { char input ; // 定义字符数组 input ,用于存储用户输入 // 模拟黑客攻击 simulateHackerAttack(route); // 黑客尝试访问 route simulateHackerAttack(schedule); // 黑客尝试访问 schedule // 提示用户输入 printf("Enter a command (e.g., 'show route'): "); // 提示用户输入命令 fgets(input, sizeof(input), stdin); // 从标准输入读取用户输入并存储在 input 中 // 去除输入中的换行符 input = 0; // 使用 strcspn 找到换行符的位置并替换为字符串结束符 '\0' // 检查输入是否安全 if (isInputSafe(input)) { // 如果输入安全 if (strcmp(input, "show route") == 0) { // 如果输入是 "show route" printf("Current route: %s\n", route); // 打印当前路线 } else if (strcmp(input, "show schedule") == 0) { // 如果输入是 "show schedule" printf("Current schedule: %s\n", schedule); // 打印当前时间表 } else { // 如果输入是其他命令 printf("Unknown command. Please try again.\n"); // 提示用户输入未知命令 } } else { // 如果输入不安全 printf("Input contains unsafe characters. Access denied.\n"); // 拒绝访问并打印警告信息 } return 0; // 程序正常退出 } 首先,我们需要明白,安全策略通常需要在多个层次上实施,包括但不限于: 输入验证和过滤:确保所有进入系统的输入都是预期的、合法的。 最小权限原则:确保系统组件只拥有执行其任务所需的最小权限。 定期更新和补丁管理:及时修复已知的安全漏洞。 安全审计和监控:检测并响应任何可疑活动。 以下是我编写的一个简化的 C 语言程序,用于检测潜在的恶意输入: #include // 引入标准输入输出库,这样我们可以使用 printf 和 scanf 等函数。 #include // 引入字符串库,这样我们可以使用 strlen 等函数。 #include // 引入字符类型库,这样我们可以使用 isalnum 等函数来检测字符是否为字母或数字。 // 这个函数是一个 " 侦探 " ,专门查找字符串中的 " 罪犯 " ——非法字符。 int contains_malicious_characters(const char *input) { // 如果传入的字符串是 " 逃犯 " (空指针),则立即报警,返回 1 表示有非法字符。 if (input == NULL) { return 1; } // 开始对字符串进行逐字符的 " 搜捕 " 。 for (size_t i = 0; i < strlen(input); i++) { // 如果字符不是 " 好人 " (字母或数字),也不是 " 卧底 " (下划线或减号),则立即报警,返回 1 表示有非法字符。 if (!isalnum(input) && input!= '_' && input!= '-') { return 1; } } // 如果整个字符串都查完了,没有发现 " 罪犯 " ,则返回 0 表示字符串合法。 return 0; } int main() { // 准备一个 " 监狱 " ,用于存放用户输入的公交站点 ID 。 char bus_stop_id ; // 提示用户输入公交站点 ID 。 printf(" 请输入公交站点 ID: "); // 使用 scanf 函数接收用户的输入,但限制最多只能输入 49 个字符,防止 " 罪犯 " 太多导致 " 监狱 " 装不下,造成 " 越狱 " (缓冲区溢出)。 scanf("%49s", bus_stop_id); // 调用 " 侦探 " 函数,检查用户输入的公交站点 ID 是否包含非法字符。 if (contains_malicious_characters(bus_stop_id)) { // 如果发现非法字符,立即报警,提示用户有潜在的恶意输入。 printf(" 警告:检测到潜在的恶意输入! \n"); } else { // 如果一切正常,则告诉用户公交站点 ID 是合法的。 printf(" 公交站点 ID 合法。 \n"); } // 程序结束,返回 0 表示一切正常。 return 0; } 这个程序仅仅是一个非常基础的输入验证。在实际应用中,需要考虑更多的安全策略和措施,包括但不限于: 使用加密技术来保护通信和数据。 实现安全审计和日志记录。 定期更新和打补丁。 使用最小权限原则来配置系统组件。 使用安全的编程实践,如避免缓冲区溢出、输入验证、错误处理等。防御黑客病毒入侵是一个持续的过程,需要不断地评估和调整安全策略。 由于黑客的攻击方式可能多种多样,因此防御策略也需要全面且不断更新。 首先,我们要明白防御黑客入侵的基本原则:最小化权限原则、输入验证、更新和修补程序、日志记录和监控、以及安全审计。 使用安全编程实践:例如,避免使用不安全的函数(如 sprintf ),而使用更安全的版本(如 snprintf )。确保所有输入都经过适当的验证和清理。 实施访问控制:确保只有经过授权的用户或系统组件才能访问敏感数据和功能。 使用加密:对于所有敏感数据和通信,使用加密来确保数据的机密性和完整性。 定期更新和修补:确保系统和所有依赖的库都是最新的,并且已经应用了所有可用的安全修补程序。 监控和日志记录:记录所有系统活动和潜在的安全事件,以便在发生问题时进行审计和调查。 安全审计和漏洞评估:定期进行安全审计和漏洞评估,以识别并修复潜在的安全风险。 培训和教育:确保开发、运维和安全团队都了解最新的安全威胁和防御策略。 请注意,防御黑客入侵是一个持续的过程,需要不断的努力和维护。 以下是我写的一个简化的 C 语言程序,展示了如何在 AI 自动驾驶公交系统中实施一些基本的防御措施: #include // 引入标准输入输出库,这样我们可以使用 printf 和 scanf 等函数 #include // 引入标准库,虽然在这段代码里它没做什么,但它是那种“总是带着,以防万一”的家伙 #include // 引入字符串处理库,虽然这里也没用到,但它总是说:“总有一天你会需要我的!” #include // 引入时间库,因为我们想记录活动发生的时间 // 定义一个函数, AI 自动驾驶公交车 void driveBus(int route, float speed) { printf("Driving bus on route %d at speed %.2f km/h\n", route, speed); // AI 说:“我要开车了,路线是 %d ,速度是 %.2f km/h 。” } // 定义一个函数,检查路线是否有效 int validateRoute(int route) { if (route 10) { printf("Invalid route number. Please enter a route between 1 and 10.\n"); // 如果路线不在 1 到 10 之间, AI 会摇头说:“这个路线不对哦,请输入 1 到 10 之间的路线。” return 0; // 返回 0 表示无效 } return 1; // 返回 1 表示有效 } // 定义一个函数,检查速度是否有效 int validateSpeed(float speed) { if (speed 60) { printf("Invalid speed. Please enter a speed between 0 and 120 km/h.\n"); // 如果速度不在 0 到 60 之间, AI 会摇头说:“这个速度太离谱了,请输入 0 到 60 之间的速度。” return 0; // 返回 0 表示无效 } return 1; // 返回 1 表示有效 } // 定义一个函数,记录活动日志 void logActivity(const char *activity) { time_t currentTime = time(NULL);// 获取当前时间 char *timeString = ctime( ¤ tTime); // 将时间转化为可读的字符串 printf(" %s\n", timeString, activity); // 记录活动和时间 // AI 说:“现在的时间是 %s ,我进行了 %s 活动。” } int main() { int route = 0; // 定义一个变量来保存路线 float speed = 0; // 定义一个变量来保存速度 // 从用户那里获取输入 printf("Enter route number: "); // AI 说:“请输入路线号:” scanf("%d", &route); // 用户输入路线号, AI 接收并保存到 route 变量里 printf("Enter speed (km/h): "); // AI 说:“请输入速度( km/h ):” scanf("%f", &speed); // 用户输入速度, AI 接收并保存到 speed 变量里 // 验证输入 if (!validateRoute(route)) { return 1; // 如果路线无效,程序就结束 } if (!validateSpeed(speed)) { return 1; // 如果速度无效,程序也结束 } // 记录活动日志 logActivity("Driving bus with valid inputs."); // AI 说:“用有效的输入来开车了,我要记录一下。” // 调用 AI 驾驶系统函数 driveBus(route, speed); // AI 说:“好的,我要开始开车了,路线是 %d ,速度是 %.2f km/h 。” return 0; // 程序正常结束 } 防御黑客攻击需要采取综合性的措施以下是一些常见的防御黑客攻击的手段: 使用强密码:使用复杂的、难猜的密码可以减少黑客破解账号的可能性。建议使用大小写字母、数字和特殊字符组合而成的长密码,并定期更换。 定期更新软件和系统补丁:及时更新操作系统、数据库和其他软件补丁,修补已知的安全漏洞,防止利用这些漏洞进行攻击。 使用加密技术:对敏感数据和通信内容进行加密处理,确保只有授权人员能够解密并获取信息。这可以有效地保护数据安全。 加强网络安全意识:提高内部员工和外部用户的安全意识,教育他们不要轻易泄露个人信息或敏感数据,不点击可疑链接或下载不明附件等。 实施访问控制策略:限制对敏感资源的访问权限,例如只允许特定的员工或部门访问某些数据或功能。这样可以防止未经授权的访问和操作。 使用防病毒软件:安装防病毒软件可以帮助检测和清除潜在的恶意软件,防止其对系统的破坏性影响。 定期备份数据:定期备份关键数据和系统镜像,可以在遭受攻击时快速恢复到初始状态,减少损失。 监控网络流量:实时监控网络流量,发现异常活动或攻击迹象及时报警和处理,有助于防范黑客攻击。 需要注意的是,以上只是一些基本的防御黑客攻击手段,实际应用中需要根据具体情况制定更全面的安全防护策略。同时,专业的安全团队也需要持续跟进威胁情报和技术趋势的变化,不断优化和完善防御方案。 #include // 引入标准输入输出库,这样我们就可以打印东西到屏幕上了,不然程序就哑巴了。 #include // 引入标准库,提供了一些基本的函数,比如 exit() 。 #include // 引入字符串处理库,但在这段代码中它其实没做什么,可能是想偷偷练习字符串操作。 #include // 引入 POSIX 操作系统 API ,这个库提供了很多底层的系统调用,像是读文件、写文件、改变权限之类的。 #include // 引入系统类型定义,为了之后使用 stat 和 chmod 函数。 #include // 引入文件状态库,为了获取文件的各种信息,比如大小、时间、权限等。 // 定义一个函数,检查文件或目录的权限 int check_permissions(const char *path) { struct stat fileStat; // 定义一个结构体来保存文件的状态信息。 if (stat(path, &fileStat) != 0) { // 使用 stat 函数获取文件状态,如果出错了就打印错误信息。 perror("stat"); // 打印出“ stat: 错误信息”,这里像是给 stat 函数加了个小喇叭,让它出错时能喊出来。 return -1; // 出错了就返回 -1 ,告诉调用者:“嘿,我这里有点问题。” } // 只允许文件拥有者读写执行 if ((fileStat.st_mode & (S_IRUSR | S_IWUSR | S_IXUSR)) != (S_IRUSR | S_IWUSR | S_IXUSR)) { fprintf(stderr, "Insecure permissions on %s\n", path); // 如果权限不对,就向标准错误输出打印一个警告信息,告诉文件:“你的权限设置得太开放了,这样不安全哦!” return -1; // 然后返回 -1 ,告诉调用者:“嘿,这个文件权限有问题。” } return 0; // 如果一切正常,就返回 0 ,告诉调用者:“这个文件权限设置得很好,没问题!” } // 定义一个函数,检查进程是否以 root 权限运行 int is_running_as_root() { if (geteuid() != 0) { // 使用 geteuid 函数检查当前进程的有效用户 ID 是否为 0 (即 root 用户)。 fprintf(stderr, "This program must be run as root\n"); // 如果不是 root 用户,就向标准错误输出打印一个信息,告诉用户:“喂,你这个程序必须要用 root 权限来运行哦!” return -1; // 然后返回 -1 ,告诉调用者:“你这个程序没有以 root 权限运行,我不接受!” } return 0; // 如果一切正常,就返回 0 ,告诉调用者:“你这个程序是以 root 权限运行的,很好!” } // 定义一个函数,设置文件权限为只有文件拥有者可以读写执行 int secure_file_permissions(const char *path) { if (chmod(path, S_IRUSR | S_IWUSR | S_IXUSR) != 0) { // 使用 chmod 函数来改变文件的权限,只允许文件拥有者读写执行。 perror("chmod"); // 如果出错了,就打印出“ chmod: 错误信息”,这里像是给 chmod 函数加了个小喇叭,让它出错时能喊出来。 return -1; // 出错了就返回 -1 ,告诉调用者:“嘿,我试图改变文件权限,但出了点问题。” } return 0; // 如果一切正常,就返回 0 ,告诉调用者:“文件权限已经成功设置为只有文件拥有者可以读写执行了。” } int main() { // 检查程序是否以 root 权限运行 if (is_running_as_root() < 0) { exit(EXIT_FAILURE); // 如果不是以 root 权限运行,就结束程序,并返回一个表示失败的状态码。 } // 检查关键文件或目录的权限 const char *critical_file = "/path/to/critical/file"; // 定义一个字符串变量来保存关键文件或目录的路径。 if (check_permissions(critical_file) < 0) { // 使用之前定义的函数来检查这个关键文件或目录的权限。 exit(EXIT_FAILURE); // 如果权限有问题,就结束程序,并返回一个表示失败的状态码。 } // 设置新文件的安全权限 const char *new_file = "/path/to/new/file"; // 定义一个字符串变量来保存新文件的路径。 if (secure_file_permissions(new_file) < 0) { // 使用之前定义的函数来设置新文件的安全权限。 exit(EXIT_FAILURE); // 如果设置权限时出错了,就结束程序,并返回一个表示失败的状态码。 } // TODO: 添加更多的安全检查和防御措施 // 这里像是一个待办事项清单,告诉开发者:“别忘了,这里还有很多其他的安全检查和防御措施需要做呢!” printf("AI 自动公交驾驶系统的基本安全措施已设置。 \n"); // 最后,打印一条信息告诉用户:“嘿,你的 AI 自动公交驾驶系统的基本安全措施已经设置好了!” return 0; // 程序执行成功,返回 0 。 } 这个程序展示了如何检查文件和目录的权限,如何确保程序以 root 权限运行,以及如何设置新文件的安全权限。然而,这只是一个非常基础的程序。在实际应用中,防御黑客病毒入侵 AI 自动公交驾驶系统需要更全面的安全策略,包括但不限于: 系统更新和补丁管理:确保操作系统、编译器、依赖库、 AI 框架等都保持最新状态,并及时应用安全补丁。 访问控制:实施严格的访问控制策略,限制对关键文件和目录的访问。 输入验证和过滤:对所有输入进行验证和过滤,防止恶意输入导致的漏洞利用。 网络和通信安全:实施加密通信、防火墙、入侵检测系统等网络安全措施。 备份和恢复策略:定期备份关键数据,并准备好在遭受攻击时能够快速恢复的策略。 我再写一个程序进行说明: #include // 我们引入了这个头文件,就像给程序喂了一勺“魔法粉末”,让它可以开始说话和听话了。 #include // 这个头文件提供了许多“标准”工具,像是变魔术一样,让我们的程序可以做出各种神奇的事情。 #include // 有了这个头文件,我们的程序就可以玩“字符串接龙”的游戏了。 #include // 引入这个头文件,就像给程序戴上一块手表,让它可以知道什么时候是早餐时间,什么时候该去睡觉了。 // 假设有一些敏感数据,如公交路线、时间表等 char route = "Route 123";// 这是一个“秘密”的公交路线,但它就像把秘密写在额头上,谁都能看见。 char schedule = "07:00-19:00";// 这是公交的时间表,但它像一张贴在车站的公告,人人皆知。 // 用于模拟黑客攻击的函数 void simulateHackerAttack(char *target) {// 这是一个假装自己是黑客的函数,但实际上它只是假装攻击一下,然后告诉所有人它做了什么。 printf("Hacker trying to access: %s\n", target);// 当这个函数被调用时,它会像黑客一样说:“我要攻击这个!” // 这里可以添加模拟黑客攻击的代码,如尝试解密、篡改数据等 // 但实际上,它只是假装攻击,并没有真的做坏事。 } // 检查输入是否安全的函数 int isInputSafe(char *input) {// 这是一个“安全检查员”函数,它会检查输入的内容是否安全。 // 检查输入是否包含非法字符或恶意代码 // 它就像用放大镜仔细检查每一个字符,看是否有坏东西。 // 这里只是一个简单的示例,实际应用中需要更复杂的检查 // 但实际上,它只检查了字符是否在 32 到 126 之间,这就像是检查一个苹果是否红,但没有检查它是否烂。 for (int i = 0; i < strlen(input); i++) {// 它开始一个一个地检查每个字符。 if (input 126) {// 如果字符不在 32 到 126 之间,就像找到了一个烂苹果。 return 0; // 输入包含非法字符 // 于是它急忙报告:“不好,有坏东西!” } } return 1; // 输入安全 // 如果检查完所有的字符都没问题,它就放心地说:“这个输入是安全的。” } int main() {// 这是程序的主入口,就像是一个大舞台,所有其他的函数和变量都在这里表演和展示。 char input ;// 这是一个“观众”变量,它准备接收用户的输入。 // 模拟黑客攻击 simulateHackerAttack(route);// 假装黑客开始攻击“秘密”的公交路线,但实际上只是告诉所有人它做了什么。 simulateHackerAttack(schedule);// 假装黑客又开始攻击时间表,但仍然只是虚张声势。 // 提示用户输入 printf("Enter a command (e.g., 'show route'): ");// 程序像是一个服务员,对用户说:“请输入一个命令,比如‘ show route ’。” fgets(input, sizeof(input), stdin);// 程序开始“聆听”用户的输入,就像是用耳朵接收声音。 // 去除输入中的换行符 input = 0;// 程序像一个细心的编辑,仔细地去掉了用户输入中的换行符,就像去掉文章中的多余空格。 // 检查输入是否安全 if (isInputSafe(input)) {// 安全检查员开始工作,检查用户的输入是否安全。 if (strcmp(input, "show route") == 0) {// 如果用户输入的是“ show route ”,程序就像是一个导游,告诉用户公交路线。 printf("Current route: %s\n", route);// 导游说:“当前的路线是 Route 123 。” } else if (strcmp(input, "show schedule") == 0) {// 如果用户输入的是“ show schedule ”,程序就像一个时间表管理员,告诉用户公交时间。 printf("Current schedule: %s\n", schedule);// 时间表管理员说:“当前的时间表是 07:00-19:00 。” } else {// 如果用户输入了其他内容,程序就像一个困惑的演员,不知道该如何表演。 printf("Unknown command. Please try again.\n");// 它只好尴尬地说:“不知道这个命令,请再试一次。” } } else {// 如果输入不安全,程序就像一个严格的保安,拒绝用户进入。 printf("Input contains unsafe characters. Access denied.\n");// 它严肃地说:“输入包含不安全字符,拒绝访问。” } return 0;// 程序表演结束,完美谢幕,等待下一次的演出。 } 请注意,编写安全代码是一个复杂且需要持续努力的过程。上述程序只是一个起点。 今天先更新到这里 ... 我在本论坛内的试读经验 : 《Proteus 实战攻略》+7 第五章双足机器人仿真实例 《GD32 MCU 原理及固件库开发指南》+ 试读心得(1 ) 《GD32 MCU 原理及固件库开发指南》+ 试读心得(2 )第八章 《GD32 MCU 原理及固件库开发指南》+ 试读心得第一章(1) 《GD32 MCU 原理及固件库开发指南》+ 试读心得第一章(2) 《GD32 MCU 原理及固件库开发指南》+ 试读心得第二章(1) 《GD32 MCU 原理及固件库开发指南》+ 试 读心得第二章(2) 《GD32 MCU 原理及固件库开发指南》+ 第三章试读心得 《GD32 MCU 原理及固件库开发指南》+ 第四章试读心得 《GD32 MCU 原理及固件库开发指南》+ 第五章MCU 基础外设 《GD32 MCU 原理及固件库开发指南》+ 第六章模拟外设 希望以上的源代码能对您有所帮助! 谢谢! 网名:还没吃饭中 2024 年3 月3 日
  • 热度 2
    2022-8-25 09:58
    2306 次阅读|
    0 个评论
    本项目采用IR传感器和Arduino开发板制作了一个数字转速计,以RPM为单位测量马达的转数。项目黑简单,只需将IR传感器和Arduino板子与16*2 LCD连接即可。 BOM表及电路图 本转速计可连续计数5秒。项目BOM表如下: Arduino UNO开发板 x1 16*2 LCD模块 x1 IR传感器模块(含发射和接收) x1 轻触开关(Reset开关) x1 面包板 x1 连接线 x1 BOM表中,IR传感器担当测速功能,该模块组合了一对发射器和接收器,可测量任何旋转物体。当我们按下开始健后,IR传感器的发射器发射的IR光线被反射后被IR接收器接收,其输出的脉冲信号被Arduino控制器检测。 IR传感器由一个IR LED和一个IR光电管组成,工作波长0.75-3μm。这里的IR光电管与用来测量IR辐射量的普通光电二极管不同,其作用是将IR光线反射回去,由IR接收器处理。IR接收器根据接收的IR光线的强度,根据特定算法得出被测物体的转速。项目使用的IR传感器特征如下: 1. 工作电压:3.0–5.0V 2. 探测距离:2–30cm(可通过电位器调节) 3. 电流消耗:23mA(3.3V);43mA(5.0V) 4. 动态输出电平:检测到物体时输出“低”电平逻辑 5. 板载障碍物LED指示器 本项目的接线稍稍复杂,具体电路图说明如下: LCD引脚 1, 3 ,5 ,16 ——— GND LCD引脚 2, 15————— VCC (+5V) LCD引脚 4 —————— – Arduino引脚 D7 LCD引脚 6 —————— – Arduino引脚 D6 LCD引脚 11 ——————- Arduino引脚 D5 LCD引脚 12 ——————- Arduino引脚 D4 LCD引脚 13 ——————- Arduino引脚 D3 LCD引脚 14 ——————- Arduino引脚 D2 IR传感器模块引脚 -GND —— GND IR传感器模块引脚 +VCC —— VCC IR传感器模块引脚 OUT — Arduino引脚D9 轻触开关端子 ————- Arduino引脚D12 轻触开关端子 ————-GND ​ 本转速计以RPM为单位测量风扇马达的转速,计算公式为:RPM= 转数 x 12 / 物体 这里的“物体”数值为每个风扇包含的叶片数目。 上传Arduino代码 本项目的代码较简单。如果上述电路连接妥当,将这些代码上传到装有Arduino IDE的电脑上,就可以开始测度了。 ​ #include LiquidCrystal lcd(7, 6, 5, 4, 3, 2); #define sensor 9 #define start 12 int delay1() { //unsigned int long k; int i,j; unsigned int count=0; for(i=0;i<1000;i++) { for(j=0;j<1000;j++) { if(digitalRead(sensor)) { count++; while(digitalRead(sensor)); } } } return count; } void setup() { pinMode(sensor, INPUT); pinMode(start, INPUT); pinMode(2, OUTPUT); lcd.begin(16, 2); lcd.print(” Tachometer”); delay(2000); digitalWrite(start, HIGH); } void loop() { unsigned int time=0,RPM=0; lcd.clear(); lcd.print(” Please Press “); lcd.setCursor(0,1); lcd.print(“Button to Start “); while(digitalRead(start)); lcd.clear(); lcd.print(“Reading RPM…..”); time=delay1(); lcd.clear(); lcd.print(“Please Wait…..”); RPM=(time*12)/3; delay(2000); lcd.clear(); lcd.print(“RPM=”); lcd.print(RPM); delay(5000); } 如果上传代码后LCD不显示计数数据,先检查Arduino和LCD模组的连接是否可靠,也可联系本文作者或硬之城技术人员。
  • 热度 24
    2012-7-13 10:06
    1264 次阅读|
    0 个评论
      在上两篇博文里我们介绍了W5300E01-ARM 交叉编译器(Cross Compiler)用户手册的前半部分,包括第一章简介和第二章的源代码下载以及第三四五章,分别是LINUX内核安装,‘BINUTILS’安装和‘GCC’安装。 在这篇博文里我们将介绍第六章’glibc’安装。希望对大家有所帮助。 第一篇博文在这里: http://forum.eet-cn.com/BLOG_ARTICLE_13051.HTM 第二篇博文在这里: http://forum.eet-cn.com/BLOG_ARTICLE_13072.HTM     6.‘glibc’ 安装 6.1移动到工作目录并解压 ‘glibc’压缩包 cd /cross_tools/ tar jxvf glibc-2.3.3.tar.bz2 6.2在 ‘glibc’ 目录下解压‘linuxhreads’ tar –C glibc-2.3.3 –jxvf glibc-linuxthreads-2.3.3.tar.bz2 cd glibc-2.3.3 6.3修改‘Makeconfig’ 文件. (第514行) 修改前       gnulib := -lgcc –lgcc_eh       修改后       gnulib := -lgcc         6.4修改‘csu/Makefile’文件(第107行) 修改前       CFLAGS-initfini.s = -g0 –fPIC –fno-inline-functions       修改后       CFLAGS-initfini.s = -O1 –g0 –fPIC –fno-inline-functions         6.5修改‘linuxthreads/Makefile’ 文件(第104行) 修改前       CFLAGS-pt-initfini.s = -g0 –fPIC –fno-inline-functions       修改后       CFLAGS-pt-initfini.s = -O1 –g0 –fPIC –fno-inline-functions         6.6修改‘sysdeps/generic/framestate.c’文件. (第44行) 修改前       frame_state_for = fallback_frame_state_for;         修改后       #ifndef __USING_SJLJ_EXCEPTIONS__ frame_state_for = fallback_frame_state_for; #else frame_state_for = abort; #endif                 6.7修改‘sysdeps/arm/machine-gmon.h’文件. (第 35 ~ 38行) 修改前       static void mcount_internal (u_long frompc, u_long selfpc);   #define _MCOUNT_DECL(frompc, selfpc) \ static void mcount_internal (u_long frompc, u_long selfpc)             修改后       #define _MCOUNT_DECL(frompc, selfpc) \ void mcount_internal (u_long frompc, u_long selfpc)           6.8修改‘sysdeps/unix/sysv/linux/arm/ioperm.c’文件(第 98 ~ 104行) 修改前       static int init_iosys (void) { char systype ; int I, n; static int iobase_name = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };                     修改后       #include static int init_iosys (void) { char systype ; int I, n; #if LINUX_VERSION_CODE 132119 static int iobase_name = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; #else static int iobase_name = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; #endif                               创建一个目录对 ‘glibc’进行编译 mkdir build cd build 6.9安装编译环境 CC=arm-linux-gcc ../configure –host=arm-linux –build=i686-pc-linux-gnu \ --prefix=/usr/local/arm/arm-linux –with-headers=/usr/src/linux/include \ --enable-add-ons=linuxthreads –enable-shared 6.10编译平台。 如果你在编译‘csu/version-info.h’文件时发生错误,打开 修正这个文件并且重新编译。 (第1~4行) make 修改前       “Compiled on a Linux 2.6.24-16-generic system on 2008-10-14 “ “Available extensions: “             修改后       “Compiled on a Linux 2.6.24-16-generic system on 2008-10-14“ “Available extensions:“         make 6.11安装编译的 ‘glibc’程序库. Make install 6.12检查安装的 ‘glibc’ 程序库 ls /usr/local/arm/arm-linux/lib     如果您有任何疑问,请直接留言或登录WIZnet官方网站:http://www.wiznettechnology.cn/ 或者来电:86-10-84539974(转166),QQ:2377211388, 邮箱:wiznetbj@wiznettechnology.com  联系人:Jerry ,谢谢! 公司微博是: http://weibo.com/wiznet2012 公司博客是:http://blog.csdn.net/WIZnet2012  
  • 热度 20
    2012-4-20 10:12
    1599 次阅读|
    0 个评论
    接上文 Arduino 和 WIZnet: http://forum.eet-cn.com/BLOG_ARTICLE_12057.HTM 具体代码如下: Code to test wiznet WIZ810MJ module See: Current features: * Read register/address values * Write register/address values * Configure networking to enable ping * Terrible hacked-together code License: LGPL (Although note spi_transfer comes from the Playground originally.) */ // Define SPI-related pins #define PIN_DATA_OUT 11 // MOSI (Master Out / Slave In) #define PIN_DATA_IN 12 // MISO (Master In / Slave Out) #define PIN_SPI_CLOCK 13 // SCK (Serial Clock) #define PIN_SLAVE_SELECT 10 // SS (Slave Select) #define PIN_RESET 9 // WIZnet module /RESET #define WIZNET_OPCODE_READ 0x0F #define WIZNET_OPCODE_WRITE 0xF0 #define DUMMY_DATA 0xFF void setup () { Serial.begin(9600); Serial.println("Setup enter..."); Serial.print("SPCR: "); Serial.println(SPCR, BIN); // Configure SPI // Configure I/O pins pinMode(PIN_DATA_OUT, OUTPUT); pinMode(PIN_DATA_IN, INPUT); pinMode(PIN_SPI_CLOCK, OUTPUT); pinMode(PIN_SLAVE_SELECT, OUTPUT); digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave // Configure SPI Control Register (SPCR) (All values initially 0) // Bit Description // 7 SPI Interrupt Enable -- disable (SPIE -- 0) // 6 SPI Enable -- enable (SPE -- 1) // 5 Data Order -- MSB 1st (DORD -- 0) (Slave specific) // 4 Master/Slave Select -- master (MSTR -- 1) // 3 Clock Polarity -- (CPOL -- 0) (Slave specific) ("Mode") // 2 Clock Phase -- (CPHA -- 0) (Slave specific) // 1 SPI Clock Rate Select 1 -- } (SPR1 -- 0) // 0 SPI Clock Rate Select 0 -- } fOSC/4 (SPR0 -- 0) ("Fastest" but see SPI2X in SPSR) SPCR = (1 Serial.print("SPCR: "); Serial.println(SPCR, BIN); // Clear previous data and status (TODO: Determine if necessary/better way.) // (Based on Playground SPI example.) byte dummy; dummy = SPSR; dummy = SPDR; delay(10); // Serial.println((1 // Serial.print("IODIR response: "); // iodirVal = getRegister(deviceOpcodeRead, REG_IODIR); // Serial.println(iodirVal, BIN); // setRegister(deviceOpcodeWrite, REG_IODIR, newVal); Serial.println("Triggering reset..."); pinMode(PIN_RESET, OUTPUT); digitalWrite(PIN_RESET, HIGH); // no reset delay(10); // Pretty arbitrary length digitalWrite(PIN_RESET, LOW); // reset delay(10); digitalWrite(PIN_RESET, HIGH); // no reset delay(10); Serial.println("Reset triggered..."); // Attempt read Serial.println("Read attempt..."); // digitalWrite(PIN_SLAVE_SELECT, LOW); // Enable slave /* byte data; data = spi_transfer(0x0F); // read Serial.print("Response: "); Serial.println(data, HEX); data = spi_transfer(0x00); // address part1 Serial.print("Response: "); Serial.println(data, HEX); data = spi_transfer(0x18); //address part2 //18 should return 0xD0 after reset. Serial.print("Response: "); Serial.println(data, HEX); data = spi_transfer(0xFF); // dummy Serial.print("Response: "); Serial.println(data, HEX); digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave */ // RTR Retry Time-value Register Serial.print("Read 0x0017: "); Serial.println(readAddressValue(0x00, 0x17), HEX); Serial.print("Read 0x0018: "); Serial.println(readAddressValue(0x00, 0x18), HEX); Serial.println("Read attempt end..."); Serial.println("Write attempt start..."); Serial.print("Initial read 0x0001: "); Serial.println(readAddressValue(0x00, 0x01), HEX); writeAddressValue(0x00, 0x01, 0xC0); Serial.print("Post-write read 0x0001: "); Serial.println(readAddressValue(0x00, 0x01), HEX); Serial.println("Write attempt end..."); Serial.println("Configure device..."); // default gateway writeAddressValue(0x00, 0x01, 0xC0); writeAddressValue(0x00, 0x02, 0xA8); writeAddressValue(0x00, 0x03, 0x02); writeAddressValue(0x00, 0x04, 0x65); // subnet mask writeAddressValue(0x00, 0x05, 0xFF); writeAddressValue(0x00, 0x06, 0xFF); writeAddressValue(0x00, 0x07, 0xFF); writeAddressValue(0x00, 0x08, 0x00); // source hardware address (MAC?) writeAddressValue(0x00, 0x09, 0x00); writeAddressValue(0x00, 0x0A, 0xDE); writeAddressValue(0x00, 0x0B, 0xAD); writeAddressValue(0x00, 0x0C, 0xBE); writeAddressValue(0x00, 0x0D, 0xEF); writeAddressValue(0x00, 0x0E, 0x00); // source ip address writeAddressValue(0x00, 0x0F, 0xC0); writeAddressValue(0x00, 0x10, 0xA8); writeAddressValue(0x00, 0x11, 0x02); writeAddressValue(0x00, 0x12, 0x69); Serial.println("End configure device..."); Serial.println("Setup exit..."); } byte readAddressValue(byte addressHiByte, byte addressLowByte) { // TODO: use a word for the address instead byte data = 0x00; digitalWrite(PIN_SLAVE_SELECT, LOW); // Enable slave // TODO: Check response values? e.g. 0x00, 0x01, 0x02 spi_transfer(WIZNET_OPCODE_READ); spi_transfer(addressHiByte); spi_transfer(addressLowByte); data = spi_transfer(DUMMY_DATA); digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave return data; } void writeAddressValue(byte addressHiByte, byte addressLowByte, byte targetValue) { // TODO: use a word for the address instead digitalWrite(PIN_SLAVE_SELECT, LOW); // Enable slave // TODO: Check response values? e.g. 0x00, 0x01, 0x02 spi_transfer(WIZNET_OPCODE_WRITE); spi_transfer(addressHiByte); spi_transfer(addressLowByte); spi_transfer(targetValue); digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave } /* byte getRegister(byte targetDeviceOpcode, byte registerAddress) { digitalWrite(PIN_SLAVE_SELECT, LOW); // Enable slave spi_transfer(targetDeviceOpcode); spi_transfer(registerAddress); // The register we want to read byte data; // Correct type? data = spi_transfer(0xFF); // Transfer dummy byte to get response digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave return data; } */ /* void setRegister(byte targetDeviceOpcode, byte registerAddress, byte value) { // TODO: Do Better? digitalWrite(PIN_SLAVE_SELECT, LOW); // Enable slave spi_transfer(targetDeviceOpcode); spi_transfer(registerAddress); // The register we want to write spi_transfer(value); digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave } */ // From Playground char spi_transfer(volatile char data) { SPDR = data; // Start the transmission while (!(SPSR (1 { }; return SPDR; // return the received byte } void loop() { }   欢迎大家留言评论~~
  • 热度 22
    2012-4-18 09:45
    2197 次阅读|
    0 个评论
    我们在利用Arduino开发网络服务器的时候,会用到以太网Shield。在其中加入以太网库后,你的设备将能够通过以太网Shield应答HTTP的请求。在打开浏览器并确认你的以太网Shield的IP地址后,你的Arduino将会用足够的HTML来应答浏览器,并让浏览器显示六个模拟针脚的输入值。 需要的硬件 Arduino 以太网 Shield 兼容Shield的 Arduino 板 Circuit 电路 以太网shield能让我们的Arduino通过SPI总线连接到一个WIZnet以太网控制器。以太网shield利用第10、11、12、13针脚来连接WIZnet的SPI。以太网shield的新产品在开发板上含有一个SD卡。数字针脚4是用来控制SD卡上面的slave select针脚。 以太网shield应当连接到一个具有以太网线的网络。你需要在程序中更改网络设置来和网络进行通信。 Arduino会被放置在以太网shield下面 示意图 源代码 /*   Web Server    A simple web server that shows the value of the analog input pins.  using an Arduino Wiznet Ethernet shield.     Circuit:  * Ethernet shield attached to pins 10, 11, 12, 13  * Analog inputs attached to pins A0 through A5 (optional)    created 18 Dec 2009  by David A. Mellis  modified 20 Mar 2012  by Tom Igoe    */ #include #include // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = {    0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1, 177); // Initialize the Ethernet server library // with the IP address and port you want to use  // (port 80 is default for HTTP): EthernetServer server(80); void  setup () {   Serial.begin(9600);    // start the Ethernet connection and the server:   Ethernet.begin(mac, ip);   server.begin();   Serial.print("server is at ");   Serial.println(Ethernet.localIP()); } void  loop () {    // listen for incoming clients   EthernetClient client = server.available();   if (client) {     Serial.println("new client");      // an http request ends with a blank line     boolean currentLineIsBlank = true;     while (client.connected()) {       if (client.available()) {         char c = client.read();         Serial.write(c);          // if you've gotten to the end of the line (received a newline          // character) and the line is blank, the http request has ended,          // so you can send a reply         if (c == ' \n '  currentLineIsBlank) {            // send a standard http response header           client.println("HTTP/1.1 200 OK");           client.println("Content-Type: text/html");           client.println("Connnection: close");           client.println();           client.println("");           client.println("");                     // add a meta refresh tag, so the browser pulls again every 5 seconds:           client.println(" ***** http-equiv="strong" / \"refresh \"  content= \" 5 \" ");            // output the value of each analog input pin           for (int analogChannel = 0; analogChannel  6; analogChannel++) {             int sensorReading = analogRead(analogChannel);             client.print("analog input ");             client.print(analogChannel);             client.print(" is ");             client.print(sensorReading);             client.println(" ");                  }           client.println("");           break;         }         if (c == ' \n ') {            // you're starting a new line           currentLineIsBlank = true;         }          else if (c != ' \r ') {            // you've gotten a character on the current line           currentLineIsBlank = false;         }       }     }      // give the web browser time to receive the data     delay(1);      // close the connection:     client.stop();     Serial.println("client disonnected");   } }   英文详细内容请参考:http://arduino.cc/en/Tutorial/WebServer 对于WIZnet的产品,如果您有什么疑问请直接留言也可以登录WIZnet的官网:http://www.wiznettechnology.cn  或者来信:Tel: 86-10-84539974(转166),QQ:2464237212,邮箱:wiznetbj@wiznettechnology.com,联系人:Lily Zhang,谢谢!        
相关资源