一些很棒的 WEB2.0 站点

http://www.blogmarks.net/ —— 用 Tags 分类的站点索引

http://www.dappit.com/index.php —— Dapper

http://www.web2list.com/ —— Web2.0 List

http://web2.wsj2.com/the_best_web_20_software_of_2005.htm —— The best web 2.0 software of 2005

http://www.fontshop.com/fontfeed/archives/web-20-logos.cfm —— Web2.0 Logos

http://del.icio.us/ —— del.icio.us

http://voo2do.com/ —— voo2do

http://digg.com/ —— digg

http://openomy.com/ —— 网络上的存储空间(网络硬盘)
``` /*======================= modbus.c ========================*/ #include "modbus.h" #include "usart1.h" #include "rs485.h" #include "timer.h" #include <string.h> // 数据存储区 static uint8_t coils[1250] = {0}; // 1-9999线圈(1位/线圈) //static uint8_t inputs[1250] = {0}; // 10001-19999 离散输入 //static uint16_t holding_regs[9999] = {0};// 40001-49999保持寄存器 //static uint16_t input_regs[9999] = {0}; // 30001-39999输入寄存器 static ModbusConfig __attribute__((unused)) current_cfg = { 115200, 0, 0, 350 }; volatile uint8_t frame_ready = 0; // 唯一实际定义 void Modbus_Init(void) { } // 发送响应帧 static void Send_Response(uint8_t *data, uint16_t len) { uint16_t i; RS485_SEND_MODE(); for(i = 0; i < len; i++) { USART_SendData(USART1, data[i]); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); RS485_RECEIVE_MODE(); } static void Handle_ReadCoils(uint8_t *frame, uint16_t len) { uint16_t start, quantity; uint8_t byte_cnt; uint8_t resp[255]; // 最大长度: 3 + 250 + 2 = 255 uint16_t idx, crc; int i; uint8_t err[3]; start = (frame[2] << 8) | frame[3]; quantity = (frame[4] << 8) | frame[5]; // 异常检查 if(start < COIL_START || (start + quantity) > COIL_END || quantity > 2000) { err[0] = frame[0]; err[1] = 0x81; err[2] = 0x02; Send_Response(err, 3); return; } // 构造响应 byte_cnt = (quantity + 7) / 8; resp[0] = frame[0]; resp[1] = 0x01; resp[2] = byte_cnt; // 数据填充 idx = start - COIL_START; memset(resp + 3, 0, byte_cnt); // 清零数据区 for(i = 0; i < quantity; i++) { if(coils[(idx + i) / 8] & (1 << ((idx + i) % 8))) { resp[3 + i / 8] |= (1 << (i % 8)); } } // CRC计算 crc = crc16(resp, 3 + byte_cnt); resp[3 + byte_cnt] = crc & 0xFF; resp[4 + byte_cnt] = crc >> 8; Send_Response(resp, 5 + byte_cnt); } void Modbus_Process(void) { static uint8_t rx_buf[256]; static uint16_t rx_len = 0; uint8_t data; uint16_t crc; // 接收处理 while(UART1GetByte(&data)) { if(rx_len < sizeof(rx_buf)) { rx_buf[rx_len++] = data; TIM2_Restart(); // 重置超时计时器 } } // 超时处理 if(frame_ready) { frame_ready = 0; // CRC校验 crc = crc16(rx_buf, rx_len - 2); if(crc == (rx_buf[rx_len - 1] << 8 | rx_buf[rx_len - 2])) { // 功能码路由 switch(rx_buf[1]) { case 0x01: Handle_ReadCoils(rx_buf, rx_len); break; // 其他功能码... } } rx_len = 0; } }```修改代码
03-24
#define USART_RXBUFF_SIZE 400 // //½ÓÊÕ»º³å,×î´ó400¸ö×Ö½Ú. u8 usart_rxBuff[USART_RXBUFF_SIZE]; u8 usart_rxBuffIndex = 0; UART_HandleTypeDef UART5_Handler; //UART¾ä±ú //³õʼ»¯IO ´®¿Ú2 //bound:²¨ÌØÂÊ void uart_init(u32 bound) { //UART ³õʼ»¯ÉèÖ&Atilde; UART5_Handler.Instance=UART5; //USART2 UART5_Handler.Init.BaudRate=bound; //²¨ÌØÂÊ UART5_Handler.Init.WordLength=UART_WORDLENGTH_8B; //×Ö³¤Îª8λÊý¾Ý¸ñʽ UART5_Handler.Init.StopBits=UART_STOPBITS_1; //Ò»¸öֹͣλ UART5_Handler.Init.Parity=UART_PARITY_NONE; //ÎÞÆæÅ¼Ð£Ñéλ UART5_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //ÎÞÓ²¼þÁ÷¿Ø UART5_Handler.Init.Mode=UART_MODE_TX_RX; //ÊÕ·¢Ä£Ê½ HAL_UART_Init(&UART5_Handler); //HAL_UART_Init()»áʹÄÜUART2 // __HAL_UART_DISABLE_IT(&UART2_Handler, UART_IT_TXE); HAL_UART_Receive_IT(&UART5_Handler, (u8 *)usart_rxBuff, 1); // HAL_UART_Transmit_IT(&UART2_Handler, (u8 *)usart_rxBuff, 1);//¸&Atilde;º¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖ&Atilde;½ÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ } //UARTµ×²&atilde;³õʼ»¯£¬Ê±ÖÓʹÄÜ£¬Òý½ÅÅäÖ&Atilde;£¬ÖжÏÅäÖ&Atilde; //´Ëº¯Êý»á±»HAL_UART_Init()µ÷Ó&Atilde; //huart:´®¿Ú¾ä±ú void HAL_UART_MspInit(UART_HandleTypeDef *huart) { //GPIO¶Ë¿ÚÉèÖ&Atilde; GPIO_InitTypeDef GPIO_Initure; if(huart->Instance==UART5)//Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ { __HAL_RCC_GPIOC_CLK_ENABLE(); //ʹÄÜGPIOAʱÖÓ __HAL_RCC_GPIOD_CLK_ENABLE(); //ʹÄÜGPIOAʱÖÓ __HAL_RCC_UART5_CLK_ENABLE(); //ʹÄÜUSART2ʱÖÓ __HAL_RCC_AFIO_CLK_ENABLE(); GPIO_Initure.Pin=GPIO_PIN_12; //PA2 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //¸´Ó&Atilde;ÍÆÍìÊä³ö GPIO_Initure.Pull=GPIO_PULLUP; //ÉÏÀ­ GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//¸ßËÙ HAL_GPIO_Init(GPIOC,&GPIO_Initure); //³õʼ»¯PA2 GPIO_Initure.Pin=GPIO_PIN_2; //PA3 GPIO_Initure.Mode=GPIO_MODE_AF_INPUT; //ģʽҪÉèÖ&Atilde;Ϊ¸´Ó&Atilde;ÊäÈëģʽ£¡ HAL_GPIO_Init(GPIOD,&GPIO_Initure); //³õʼ»¯PA3 // GPIO_Initure.Pin=GPIO_PIN_6; //PA6 RS485_EN // GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //ÍÆÍìÊä³ö // HAL_GPIO_Init(GPIOA,&GPIO_Initure); //³õʼ»¯PA6 RS485_EN // // RS485_EN = 0; // À­µÍʹÄÜ,½ÓÊÜÊý¾Ý HAL_NVIC_EnableIRQ(UART5_IRQn); //ʹÄÜUSART2ÖжÏͨµÀ HAL_NVIC_SetPriority(UART5_IRQn,3,3); //ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 } } //´®¿Ú2ÖжϷþÎñ³ÌÐò //×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜ&Atilde;âĪ&Atilde;ûÆä&Atilde;îµÄ´íÎó static void Usart_PID_Handler(void); void UART5_IRQHandler(void) { u8 dat; OSIntEnter(); if(__HAL_UART_GET_FLAG(&UART5_Handler, UART_FLAG_RXNE)!=RESET) //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ) { //@100ms@100@0@0@101325Pa@101325Pa dat = UART5->DR; usart_rxBuff[usart_rxBuffIndex % USART_RXBUFF_SIZE] = dat; usart_rxBuffIndex++; if(usart_rxBuff[0] != '@'){usart_rxBuffIndex = 0;} if(dat == '\n'){ Usart_PID_Handler(); usart_rxBuffIndex = 0; } } OSIntExit(); } static u8 MyPrintfBuff[100]; void MyPrintf(char *format, ...) { uint16_t buf_len; va_list v_args; va_start(v_args, format); buf_len = vsnprintf((char *)&MyPrintfBuff[0], (size_t ) sizeof(MyPrintfBuff), (char const *) format, v_args); va_end(v_args); if(buf_len >= sizeof(MyPrintfBuff)){buf_len = sizeof(MyPrintfBuff);} // RS485_EN = 1; // À­¸ßʹÄÜ,·¢ËÍÊý¾Ý HAL_UART_Transmit(&UART5_Handler, MyPrintfBuff, buf_len, HAL_MAX_DELAY); // RS485_EN = 0; // À­µÍʹÄÜ,½ÓÊÜÊý¾Ý }修改为硬件为w5500模块的modbus-tcp协议
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值