关于串口接收数据缓冲问题

我用串口测试实时接收一个2k采样率的正弦波并显示波形,不管是我自己写的程序还是Labview
都出现了同一个问题,就是一开始波形的频率是对的,然后我进入中断一会,回来继续接收数据
感觉波形被压缩了一样,突然来了一大堆数据,过一会就会恢复正常。这是缓存区哪里的问题呢?接收缓冲,传输缓冲?

4个回答

接收缓冲吧,数据没被处理。

在中断时,串口设备还在不断的发送数据;
中断结束,恢复正常时:接收缓存区有一大堆数据,这时你有两种处理方式:
1、把这些数据都清空不要;
2、对这些数据进行处理。(注意这些数据可能有多个包,有些包数据不完整)

接收缓存区一直在接收数据,直到填满为止。填满后会覆盖原先的。

串口接收数据寄存器收到数据后会把接收标志位RI置位的,电脑发送数据是一个字节接着一个字节,两个字节之间会有延时,所以收到数据你需要尽快处理,不然可能会被新的数据覆盖,配置中断就是为了及时响应把数据读出存储起来。所以接收数据寄存器内收到数据后RI就会置1,在中断里把数据存储 然后及时把RI清零接收下一字节数据。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Wince6.0 串口缓冲区同时接收到数据的问题
Wince6.0 串口缓冲区同时接收到数据的问题,当串口缓冲区正在接收一串数据时,又有一串数据需要接收,这样就有一串有用的数据出现错误,请问各路大神这个问题怎么解决?急
着急串口程序真心感谢
![图片说明](https://img-ask.csdn.net/upload/201507/18/1437190635_870015.png) 这是我的串口接收程序,怎么在一运行程序就响应oncomm函数,接收数据总是52428 是不接收缓冲区总有数据啊?谢谢各位真心感谢
关于c#做上位机串口接收数据的问题,求大神讲解
由于是第一次写上位机程序,接收数据的函数用的是别人的,这个函数public void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e),它是被动响应的吗?是不是缓冲区堆不满就不会得到数据?
求助:VC++串口接收数据问题
1.首先是打开串口,打开成功发送握手命令如下: ``` void CMainFrame::OnMenuconnectbox() { // TODO: 在此添加命令处理程序代码 BOOL bRet = m_serial.Open(GetSafeHwnd(),WM_COMM_MESSAGE,nCom,dwBaudRate,byByteSize,byParity,byStopBits); if(bRet) { //ShowMessage("成功打开串口!"); m_wndOutput.m_wndOutputBuild.AddString(_T("成功打开串口!")); unsigned char szData[1]={0x7e};//发送握手命令 m_serial.SendData(szData,1); } else { //ShowMessage("打开串口失败!"); m_wndOutput.m_wndOutputBuild.AddString(_T("打开串口失败!")); } } ``` 2、在串口消息里收到判断回复,握手成功后发送数据下载命令,上位机接到下载命令后开始发送数据,每次发送2048个字节,循环发送2M数据,消息响应函数如下: ``` LRESULT CMainFrame::OnCommMessage(WPARAM wParam,LPARAM lParam) { m_wait = 0; int len=128; static unsigned char szData[2048]; CFile * pFile; // 创建数据保存文件 switch(wParam) { case MSG_READ: { // unsigned int pp = m_serial.ReadData(szData,len); if(m_serial.ReadData(szData,len)) { //ShowMessage(CString(szData)); int pp = sizeof(szData); CString str,str1; CString strForder; str.Format("%0x",szData[0]); f.Write(szData,len); m_wndOutput.m_wndOutputBuild.AddString(str); if (szData[0] == 0x7f/*0x5b*/)//握手命令 { m_comflag = true; m_wndOutput.m_wndOutputBuild.AddString("串口通讯握手成功!"); unsigned char pSend[1]={0x76};//发送握手命令 m_serial.SendData(pSend,1); //写入刚才读取的文件 FILE *pFileOut=fopen("C:\\2.jpg","wb"); fwrite(pBuf,1,len,pFileOut); fclose(pFileOut); free(pBuf); //释放 } } } break; case MSG_WRITE: { unsigned char *p=(unsigned char*)lParam; CString str/* = CString(p)*/; str.Format("%0x",*p); m_wndOutput.m_wndOutputBuild.AddString(str); Sleep(500); } break; default: { } break; } return 0L; } ``` 现在的问题是握手命令和下载命令都可以正常收到,但是对方收到下载命令后发送的数据却收不到,并且断点跟踪OnCommMessage(WPARAM wParam,LPARAM lParam)并没有进入响应更新缓冲区,求助各位指教!
STM32 串口收发数据出错
#include "stm32f10x.h" #include <stdio.h> /************************************************* 函数: void RCC_Configuration(void) 功能: 复位和时钟控制 配置 参数: 无 返回: 无 **************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量 RCC_DeInit(); //复位RCC外部设备寄存器到默认值 RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好 if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好 { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后 FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时 RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟 RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz RCC_PLLCmd(ENABLE); //使能PLL时钟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪 { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟 while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟 { } } } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures NVIC and Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //通道设置为串口3中断 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中断响应优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断 NVIC_Init(&NVIC_InitStructure); //初始化 } /******************************************************************************* 函数名:USART3_Configuration 输 入: 输 出: 功能说明: 初始化串口硬件设备,启用中断 配置步骤: (1)打开GPIO和USART3的时钟 (2)设置USART3两个管脚GPIO模式 (3)配置USART3数据格式、波特率等参数 (4)使能USART3接收中断功能 (5)最后使能USART3功能 */ void USART3_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 第1步:打开GPIO和USART部件的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* 第2步:将USART Tx的GPIO配置为推挽复用模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第3步:将USART Rx的GPIO配置为浮空输入模式*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* 第4步:配置USART3参数*/ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); /* 若接收数据寄存器满,则产生中断 */ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 第5步:使能 USART3, 配置完毕 */ USART_Cmd(USART3, ENABLE); /* 如下语句解决第1个字节无法正确发送出去的问题 */ USART_ClearFlag(USART3, USART_FLAG_TC); // 清标志 } /*******************************************************************/ /* */ /* STM32向串口3发送1字节 */ /* */ /* */ /*******************************************************************/ void Uart3_PutChar(u8 ch) { USART_SendData(USART3, (u8) ch); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } /*******************************************************************/ /* */ /* STM32在串口3接收1字节 */ /* 说明:串口3接收中断 */ /* */ /*******************************************************************/ void USART3_IRQHandler(void) { u8 dat; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收数据寄存器满 { dat = USART_ReceiveData(USART3); Uart3_PutChar(dat); } } /************************************************* 函数: int main(void) 功能: main主函数 参数: 无 返回: 无 **************************************************/ int main(void) { u8 abc[]={0x11,0x12,0x13,0x14}; u8 i; RCC_Configuration(); NVIC_Configuration(); USART3_Configuration(); for(i=0;i<4;i++) {Uart3_PutChar(abc[i]);} while(1); }
Vb串口接收不到数据 请大师们赐教
'发送数据 Private Sub senddata_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles senddata.Click Dim strincoming As String Dim xx As String Dim yy As String Try SerialPort1.Write(senddata.Text, 0, 4) Threading.Thread.Sleep(1000) If SerialPort1.BytesToRead > 0 Then Threading.Thread.Sleep(100) '添加延时 strincoming = SerialPort1.ReadExisting.ToString '读取缓冲区中的数据 SerialPort1.DiscardInBuffer() RXbox.Text = strincoming End If Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub 程序如上 senddata为发送数据,RXbox为接收数据框 ,串口已经打开,用串口助手调试可发射和接收,自己编的程序senddata输入1 接收RXbox里面都是空的 ,请大师指教
新手,在做基于C++的串口接收数据导入SQL数据库的程序。有问题想请教大家。
这是我写的串口接受的程序,现在可以接收串口数据并成功存入数据库,但是无法将数据根据需要存入数据库表中的特定列。接收的数据应该是以空格来断开,从而存入不同的表中,现在只能讲接受的数据都存入一列当中,请大家帮我看看程序,怎么改写。先谢过大家 void CChuankouDlg::OnComm() { xinxi m_xinxi; // TODO: Add extra initialization here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; CString str; CString str1; CString str2; CString strtemp; if (m_ctrlComm.GetCommEvent() == 2)//事件值为2表示接收缓冲区内有字符 { variant_inp = m_ctrlComm.GetInput(); safearray_inp = variant_inp; len = safearray_inp.GetOneDimSize(); for (k = 0; k<len; k++) { safearray_inp.GetElement(&k, rxdata + k); } for (k = 0; k<len; k++) { BYTE bt = *(char*)(rxdata + k); strtemp.Format("%c", bt); m_strEditRXData += strtemp; str += strtemp; } //::MessageBox(NULL,time,"当前时间",MB_OK); COleDateTime time = COleDateTime::GetCurrentTime(); CString s1= time.Format("%y:%m:%d:%H:%M:%S"); m_xinxi.sql_insert(s1,str,str2); } UpdateData(FALSE);//更新编辑框内容 }
WPF串口通信数据出队列操作得到null对象
代码: private void Window_Loaded(object sender, RoutedEventArgs e) { . . . ComPort.DataReceived += new SerialDataReceivedEventHandler(ComReceive);//串口接收中断 Thread _ComRec = new Thread(new ThreadStart(ComRec)); //串口接收数据线程 _ComRec.Start();//启动线程 } // 读串口数据,并进队列 private void ComReceive(object sender, SerialDataReceivedEventArgs e) { byte[] recBuffer;//接收缓冲区 try { recBuffer = new byte[ComPort.BytesToRead];//接收数据缓存大小 ComPort.Read(recBuffer, 0, recBuffer.Length);//读取数据 recQueue.Enqueue(recBuffer);//读取数据入列 } catch{...} } //数据出队列,在数据接收线程中执行 void ComRec() { while (true) { if (recQueue.Count > 0) { byte[] recBuffer = (byte[])recQueue.Dequeue();//出列 ProcessData(recBuffer);//** 此处为出问题的地方** } } } ----------------------------------------------------------------------------------- 问题描述: 波特率设为115200,发送端周期(10ms)性发送长度为78字节的数据。接收端运行一段时间后,ProcessData(recBuffer)出报错,此时数组recBuffer为null。 关于发送周期:115200/8 > 78/10ms,即10ms满足速率要求。当发送周期从10ms改成100ms的时候,recBuffer为null的现象似乎很少出现了。 求问:数据出队列得到null数组的原因是什么?怎样修改可以避免这个问题? 求高人指点,小弟感激不尽!
MSP430F149串口接收中断数据存储问题,SOS~
我在使用串口接收中断读取NFC模块数据时,我想将NFC模块回传的状态指令存储于数组中。通过串口助手,NFC模块可以收到单片机发送的请求指令,同时会向MSP430单片机发送状态指令。但是数组中并没有相关数据,请各位指点迷津,感激不尽!代码如下: ``` /********************************************************************** USART0 接收中断函数 ***********************************************************************/ #pragma vector = USART0RX_VECTOR __interrupt void Usart0_Rx(void) { IE1&=~URXIE0; //关闭串口中断使能 uint i=3; uchar *pq0=value; //value[N_Data]={0xfe,0xfe,0xfe,0xf,...} SendUart(pq0,N_Data); //发送数据请求指令 Add_UsData(RXBUF0); //接收NFC状态 while(P2IN==1) //有手机靠近NFC { i--; if(aRxBuff[9]==0xE7) { TXBUF0 = (uchar)times0; } else SendUart(pq0,20); if(i==0) break; } IE1|=URXIE0; // 使能USART0的接收中断 } /********************************************************************** 功能:发送函数。采用查询方式。 PBuffer:指向发送数据缓冲区的指针 n_byte:发送的字节数 ***********************************************************************/ void SendUart(uint *pBuffer,uint n_byte) { uint q0; for(q0=0;q0<n_byte;q0++) { while((IFG1&UTXIFG0)==0); //判断是否发送完毕 TXBUF0=*pBuffer; pBuffer++; } pBuffer=0; } /********************************************************************** 处理NFC状态数据 ***********************************************************************/ void Add_UsData(uchar *sq0) { if(NRxBuff<N_Data) { while((IFG1&URXIFG0)==0); //判断是否接收完毕 aRxBuff[NRxBuff]=*sq0; NRxBuff++; } NRxBuff=0; } ```
STM32串口接收数据有时候会出错
void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStruct ; USART_InitTypeDef USART_InitStruct ; NVIC_InitTypeDef NVIC_InitStruct ; #ifdef DMA_EN DMA_InitTypeDef DMA_InitStructure ; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //DMA1通道5配置 DMA_DeInit(DMA1_Channel6); //USART2_RX DMA1 channel 6 //外设地址 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR); //内存地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART_Rev_Buffer; //dma传输方向单向 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置DMA在传输时缓冲区的长度 DMA_InitStructure.DMA_BufferSize = 40 ;//UART_RX_LEN; //设置DMA的外设递增模式,一个外设 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的内存递增模式 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //外设数据字长 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //内存数据字长 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //设置DMA的传输模式 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的优先级别 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //设置DMA的2个memory中的变量互相访问 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel6,&DMA_InitStructure); //使能通道6 DMA_Cmd(DMA1_Channel6,ENABLE); #endif RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); USART_DeInit(USART2) ; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 ; //USART1-TX GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 ; //USART1-RX GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ; GPIO_Init(GPIOA,&GPIO_InitStruct); USART_InitStruct.USART_BaudRate = 115200 ; USART_InitStruct.USART_WordLength = USART_WordLength_8b ; USART_InitStruct.USART_StopBits = USART_StopBits_1 ; USART_InitStruct.USART_Parity = USART_Parity_No ; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; USART_Init(USART2,&USART_InitStruct) ; NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0 ; //抢占优先级 3 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; //子优先级 3 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStruct); USART_ITConfig(USART2,USART_IT_IDLE,ENABLE) ; /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 如下语句解决第1个字节无法正确发送出去的问题 */ //USART_ClearFlag(USART2, USART_FLAG_TC); /* 清发送外城标志,Transmission Complete*/ USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); // 开启串口DMA接收 USART_Cmd(USART2, ENABLE); } void USART2_IRQHandler(void) { uint8_t temp = 0; uint8_t i = 0; if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) { //USART_ClearFlag(USART1,USART_IT_IDLE); temp = USART2->SR; temp = USART2->DR; //清USART_IT_IDLE标志 DMA_Cmd(DMA1_Channel6,DISABLE); temp = 40 - DMA_GetCurrDataCounter(DMA1_Channel6); //接收到数据的长度 for(i=0;i<temp;i++) { printf(" %x ",USART_Rev_Buffer[i]); } printf("\r\n"); printf("\r\n"); //if(temp == USART_Rev_Buffer[4]+5) //{ // USART_FLAG_RX = 1 ; //标志位置1 //USART_TX = 0 ; //} //设置传输数据长度 DMA_SetCurrDataCounter(DMA1_Channel6,40); //打开DMA DMA_Cmd(DMA1_Channel6,ENABLE); } __nop(); } ![图片说明](https://img-ask.csdn.net/upload/201704/13/1492079684_720557.png)
C#串口数据读取问题求助
用C#中的一个serialport类读取cc2431传感器通过usb(com口)传来的数据,程序代码如下 void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 received_count += n;//增加接收计数 comm.Read(buf, 0, n);//读取缓冲数据 builder.Clear();//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是否是显示为16禁止 if (checkBoxHexView.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 this.txGet.AppendText(builder.ToString()); //修改接收计数 labelGetCount.Text = "Get:" + received_count.ToString(); })); } 会读取到如下数据71 09 FC 08 00 F1,而实际上用配套的串口调试助手得到的一串数据时这样的:04 C0 E0 D8 27 3B 03 23 4D 80 03 B0 02 00 4C 00 40 7F C0 4C 32 32 00 42 24 FF 不知道程序哪里应该改动,才能得到同串口调试助手一样的数据
STM32为什么用串口接收数据不全,时常丢失?
``` ```#include "stm32f10x.h" #include "usart.h" #include "delay.h" void My_USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; //①使能GPIOA和串口1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //②初始化GPIOA两个引脚 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); //③串口初始化 //波特率 USART_InitStrue.USART_BaudRate=115200; //硬件控制 USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //奇偶验证 USART_InitStrue.USART_Parity=USART_Parity_No; //停止位 USART_InitStrue.USART_StopBits=USART_StopBits_1; //字长 USART_InitStrue.USART_WordLength=USART_WordLength_8b; USART_Init(USART1,&USART_InitStrue); //串口使能 USART_Cmd(USART1,ENABLE);//③ USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接受中断 USART_ITConfig(USART1,USART_IT_ORE,ENABLE);//开启溢出中断 //初始化中断 NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStrue.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitStrue); } u8 usart_buf[4][USART_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节 static volatile u16 count=0;//接收状态标记 static volatile int p=0; void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//开启接收中断 { USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志中断位 p = (count / USART_REC_LEN) % 4; usart_buf[p][count % USART_REC_LEN] = USART_ReceiveData(USART1); count++; } } int main(void) { //要使用中断,先要中断分组,一般在主函数的开头 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); My_USART1_Init(); delay_init(); while(1){ if(count > 0){ if(count % 256 == 0){ for(int i = 0; i < 256; i++){ USART_SendData(USART1,usart_buf[p][i]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } printf("\r\n\r\n"); delay_ms(100); } } }; } ![图片说明](https://img-ask.csdn.net/upload/201910/31/1572495626_268037.png)
VS 串口数据发送不到下位机
#ifndef SERIALPORT_H_ #define SERIALPORT_H_ #include <Windows.h> #include <math.h> #include <iostream> #include <cv.hpp> #include <highgui/highgui.hpp> #include<opencv2/opencv.hpp> /** 串口通信类 * * 本类实现了对串口的基本操作 * 例如监听发到指定串口的数据、发送指定数据到串口 */ class CSerialPort // (int * pData) { public: CSerialPort(void); ~CSerialPort(void); public: /** 初始化串口函数 * * @param: UINT portNo 串口编号,默认值为1,即COM1,注意,尽量不要大于9 * @param: UINT baud 波特率,默认为9600 * @param: char parity 是否进行奇偶校验,'Y'表示需要奇偶校验,'N'表示不需要奇偶校验 * @param: UINT databits 数据位的个数,默认值为8个数据位 * @param: UINT stopsbits 停止位使用格式,默认值为1 * @param: DWORD dwCommEvents 默认为EV_RXCHAR,即只要收发任意一个字符,则产生一个事件 * @return: bool 初始化是否成功 * @note: 在使用其他本类提供的函数前,请先调用本函数进行串口的初始化 *      /n本函数提供了一些常用的串口参数设置,若需要自行设置详细的DCB参数,可使用重载函数 * /n本串口类析构时会自动关闭串口,无需额外执行关闭串口 * @see: */ bool InitPort( UINT portNo = 5,UINT baud = CBR_9600,char parity = 'N',UINT databits = 8, UINT stopsbits = 1,DWORD dwCommEvents = EV_RXCHAR); /** 串口初始化函数 * * 本函数提供直接根据DCB参数设置串口参数 * @param: UINT portNo * @param: const LPDCB & plDCB * @return: bool 初始化是否成功 * @note: 本函数提供用户自定义地串口初始化参数 * @see: */ bool InitPort( UINT portNo ,const LPDCB& plDCB ); /** 开启监听线程 * * 本监听线程完成对串口数据的监听,并将接收到的数据打印到屏幕输出 * @return: bool 操作是否成功 * @note: 当线程已经处于开启状态时,返回flase * @see: */ bool OpenListenThread(); /** 关闭监听线程 * * * @return: bool 操作是否成功 * @note: 调用本函数后,监听串口的线程将会被关闭 * @see: */ bool CloseListenTread(); /** 向串口写数据 * * 将缓冲区中的数据写入到串口 * @param: unsigned char * pData 指向需要写入串口的数据缓冲区 * @param: unsigned int length 需要写入的数据长度 * @return: bool 操作是否成功 * @note: length不要大于pData所指向缓冲区的大小 * @see: */ bool WriteData(unsigned char * pData,unsigned int length); /** 获取串口缓冲区中的字节数 * * * @return: UINT 操作是否成功 * @note: 当串口缓冲区中无数据时,返回0 * @see: */ UINT GetBytesInCOM(); /** 读取串口接收缓冲区中一个字节的数据 * * * @param: char & cRecved 存放读取数据的字符变量 * @return: bool 读取是否成功 * @note: * @see: */ bool ReadChar(char &cRecved); private: /** 打开串口 * * * @param: UINT portNo 串口设备号 * @return: bool 打开是否成功 * @note: * @see: */ bool openPort( UINT portNo ); /** 关闭串口 * * * @return: void 操作是否成功 * @note: * @see: */ void ClosePort(); /** 串口监听线程 * * 监听来自串口的数据和信息 * @param: void * pParam 线程参数 * @return: UINT WINAPI 线程返回值 * @note: * @see: */ static UINT WINAPI ListenThread(void* pParam); private: /** 串口句柄 */ HANDLE m_hComm; /** 线程退出标志变量 */ static bool s_bExit; /** 线程句柄 */ volatile HANDLE m_hListenThread; /** 同步互斥,临界区保护 */ CRITICAL_SECTION m_csCommunicationSync; //!< 互斥操作串口 }; #endif //SERIALPORT_H_ int main() { int * pData,b = 1; int a = 1; pData = &b; printf("%d",*pData); return 0;http://ask.csdn.net/questions?type=reward# }
c#用serialport进行的串口数据接收,遇到了问题,求大神指点
运行后再richtextbox1中只显示一个数,例如:33 随后会报错:对象未引用到对象的实例,点了关闭后又会出现一个数据,例如31,之后又会报错,如此循环,而且数据不太对。 整了好久了,希望能帮帮忙,第一次做这,谢谢!! 代码: namespace yfy_串口调试 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /****************************设置变量******************************/ public string[] strArray; public SerialPort sp1 = new SerialPort(); public Byte[] mydata; public int mydatalength; //这个数的值是由接收到的字节长度决定的,并且作为mydata的长度,如果索引值还超过数组定义值,就应该是接收问题。 public int zhengfu = 2, now_x = 30; public static Bitmap bmp = new Bitmap(500,350); public Graphics gph = Graphics.FromImage(bmp); public char name_image='A'; /*****************************相关函数****************************/ public void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)//数据接收函数 { if (sp1.IsOpen==true ) //为了严谨性,加上检查串口是否被打开 { if (rbRcv16.Checked == true) //接收16进制按钮 { try { int average_speed = 0; //设置初始平均速度 Byte[] receivedData = new Byte[sp1.BytesToRead]; //创建接收字节数组 sp1.Read(receivedData, 0, receivedData.Length); //读取数据 sp1.DiscardInBuffer(); //清空SerialPort控件的Buffer mydatalength = receivedData.Length; for (int i = 0; i < receivedData.Length; i++) //窗体显示 { richTextBox1.Text = receivedData[i].ToString("X2"); //16进制显示在接受栏 mydata[i] = receivedData[i]; richTextBox1.Text += ","; //让每个数据都隔开 average_speed += receivedData[i]; } textBox1.Text = (average_speed / receivedData.Length).ToString("X2"); } catch (System.Exception ex) { MessageBox.Show(ex.Message, "出错提示"); } } } else { MessageBox.Show("请打开某个串口或者没有选中16进制接收", "错误提示"); } } private void Form1_Load(object sender, EventArgs e)//页面初始化 { Control.CheckForIllegalCrossThreadCalls = false; //强制不检查线程 sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); //订阅委托 sp1.ReceivedBytesThreshold =1; //当缓冲区的字节数为x时,触发datareceive事件 //检查是否有串口 string[] str = SerialPort.GetPortNames(); if (str == null) { MessageBox.Show("本机没有串口!", "Error!"); return; } //添加串口项目 foreach (string s in System.IO.Ports.SerialPort.GetPortNames()) { cbSerial.Items.Add(s); //获取有COM口 } rbRcv16.Checked = true; //接收数据按16进制进行 } private void btnSwitch_Click(object sender, EventArgs e)//设置串口 { if (sp1.IsOpen == false) { try { string serialName = cbSerial.SelectedItem.ToString();//读取串口号 sp1.PortName = serialName; //设置串口号 sp1.BaudRate = 9600; //波特率 sp1.DataBits = 8; //数据位 sp1.StopBits = StopBits.One; //停止位 sp1.Parity = Parity.None; //校验位 sp1.Open(); //打开串口 btnSwitch.Text = "关闭串口"; } catch (System.Exception ex) { MessageBox.Show("Error:" + ex.Message, "Error"); return; } } else { sp1.Close(); //关闭串口 btnSwitch.Text = "打开串口"; } }
新手求助!!c++串口通讯,缓冲区设置失败,是结构体指针设置错误吗?求指导。
//头文件 ```class IDC_DLL_CLASS CComDevice { //串口类方法 public: CComDevice(); virtual ~CComDevice(); //打开串口 int Open(char * , LPDCB); //关闭串口 int Close(); //读串口收到的数据(一次) int Read(char *, DWORD); //读串口收到的数据(同步) int WaitRead(char *, DWORD, DWORD, DWORD); //向串口写数据(同步) int Write(char *, DWORD, DWORD); //串口类属性 public: DWORD m_error_code;//最后一次操作错误码(windows定义) DCB m_state;//串口配置 HANDLE m_handle; //串口句柄 COMMTIMEOUTS m_Timeouts;//读写超时时间 }; ``` //串口打开 int CComDevice::Open(char * Port , LPDCB lpDCB) { //操作错误码复位 this->m_error_code = 0; //判断串口是否已经打开 if (this->m_handle != NULL) { printf("串口打开失败"); return -1; } //打开串口文件 this->m_handle = ::CreateFileA(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); printf("打开串口文件"); printf("\n"); if (this->m_handle == INVALID_HANDLE_VALUE) { this->m_error_code = ::GetLastError();//获取错误码 this->m_handle = NULL;//串口句柄置空 printf("系统错误\n"); return -2; } try { //设置串口读写缓冲区大小 if (!SetupComm(this->m_handle, 2048, 2048)) printf("\n"); printf("设置串口读写缓冲区大小错误"); //配置失败 throw(FALSE); //终止串口所有异步读写操作并清空读写缓冲区 if (!PurgeComm(this->m_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR)) printf("\n"); printf("终止串口所有异步读写操作并清空读写缓冲区错误"); throw(FALSE); //获取串口默认配置 if (!GetCommState(this->m_handle, &this->m_state)) printf("\n"); printf("获取串口默认配置错误"); throw(FALSE); this->m_state.DCBlength = sizeof(DCB); //DCB长度 this->m_state.BaudRate = lpDCB->BaudRate; //波特率 this->m_state.ByteSize = lpDCB->ByteSize; //通信字节位数 this->m_state.Parity = lpDCB->Parity;//奇偶校验位 this->m_state.StopBits = lpDCB->StopBits; //停止位 this->m_state.fOutxDsrFlow = lpDCB->fOutxDsrFlow; this->m_state.fDtrControl = lpDCB->fDtrControl; this->m_state.fOutxCtsFlow = lpDCB->fOutxCtsFlow; this->m_state.fRtsControl = lpDCB->fRtsControl; this->m_state.fInX = lpDCB->fInX; this->m_state.fOutX = lpDCB->fInX; this->m_state.XonChar = lpDCB->XonChar; this->m_state.XoffChar = lpDCB->XoffChar; this->m_state.XonLim = lpDCB->XonLim;//指定在XON字符发送之前接收缓冲区中空缓冲区可允许的最小字节数 this->m_state.XoffLim = lpDCB->XoffLim;//指定在XOFF字符发送之前接收缓冲区中空缓冲区可允许的最小字节数 this->m_state.fBinary = lpDCB->fBinary; this->m_state.fParity = lpDCB->fParity; //设置串口制订配置 if (!SetCommState(this->m_handle, &(this->m_state))) printf("\n"); printf("配置错误"); throw(FALSE); } catch (BOOL) { this->m_error_code = ::GetLastError();//获取错误码 ::CloseHandle(this->m_handle);//关闭串口 this->m_handle = NULL;//串口句柄置空 printf("\n串口错误"); //------>程序运行到这里卡住 return -1; } printf("打开串口成功"); return 0; } ``` //main函数打开串口 `int _tmain(int argc, _TCHAR* argv[]) { CComDevice CardReader; DCB DCB_COM; DCB_COM.DCBlength = 50; DCB_COM.BaudRate = CBR_9600; // 设置波特率9600 DCB_COM.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE DCB_COM.fParity = TRUE; // 支持奇偶校验 DCB_COM.fOutxCtsFlow = FALSE; // No CTS output flow control DCB_COM.fOutxDsrFlow = FALSE; // No DSR output flow control DCB_COM.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control DCB_COM.XonChar = 0; DCB_COM.XoffChar = 0; DCB_COM.XonLim = 100; DCB_COM.XoffLim = 100; //DCB_COM.fDsrSensitivity = FALSE; // DSR sensitivity //DCB_COM.fTXContinueOnXoff = TRUE; // XOFF continues Tx DCB_COM.fOutX = FALSE; // No XON/XOFF out flow control DCB_COM.fInX = FALSE; // No XON/XOFF in flow control //DCB_COM.fErrorChar = FALSE; // Disable error replacement //DCB_COM.fNull = FALSE; // Disable null stripping DCB_COM.fRtsControl = RTS_CONTROL_DISABLE; //No RTS flow control //DCB_COM.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写 DCB_COM.ByteSize = 8; // 数据位,范围:4-8 DCB_COM.Parity = NOPARITY; // 校验模式 DCB_COM.StopBits = 0; // 1位停止位 int a = CardReader.Open("COM5", &DCB_COM); cout << "\na:" << a << endl; system("pause"); return 0; }`` ``` ![图片说明](https://img-ask.csdn.net/upload/201905/27/1558924537_857227.png)
VB串口接收数据重复怎么办????
Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll TextBox2.Text = HScrollBar1.Value SerialPort1.Write(TextBox2.Text) ' TextBox7.Text = SerialPort1.BytesToRead SerialPort1.DiscardInBuffer() End Sub Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click Dim n As Integer n = SerialPort1.BytesToRead If n > 0 Then TextBox6.Text = SerialPort1.ReadExisting() ElseIf n <= 0 Then MsgBox("缓冲区无数据") End If End Sub ![图片说明](https://img-ask.csdn.net/upload/201505/21/1432187109_366700.jpg)
c#串口数据读取不全问题
![正确的NFC贴片值](https://img-ask.csdn.net/upload/201611/30/1480487915_614568.png) 我自己写的值和代码 private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { System.Threading.Thread.Sleep(100);//延时100ms等待接收完数据 // this.Invoke就是跨线程访问ui的方法 this.Invoke((EventHandler) (delegate { if (isHex == false) { tbxRecvData.Text += sp.ReadLine(); } else { Byte[] ReceivedData = new Byte[sp.BytesToRead]; sp.Read(ReceivedData, 0, ReceivedData.Length); String RecvDataText = null; for (int i = 0; i < ReceivedData.Length; i++) { RecvDataText += (" " + ReceivedData[i].ToString("X2") + ""); } tbxRecvData.Text += RecvDataText; } sp.DiscardInBuffer();//丢弃接收缓冲区数据 })); } ![图片说明](https://img-ask.csdn.net/upload/201611/30/1480488296_546399.png)
CC2530,串口通信,收发字符问题。
本人单片机新手。下面的程序是正确可达到目的。 对于这个程序我有2个地方不太理解,望大神不吝赐教。 第一个:【设置发送字符串的函数】这个块儿,不太能理解。特别是我注释的地方。 第二个:【主方法中】接收那部分,有一个注释的地方,搞不懂。求解释。。。 没有金币,,,不知道有大神赐教没。。。跪谢。。。 ``` /* 设置串口波特率115200bps,8N1 串口调试助手给CC2530发送字符串,开发板则返回同样字符。 */ #include<ioCC2530.h> #include<string.h> typedef unsigned char uchar; typedef unsigned int uint; #define SIZE 50 char RxBuf; char RxData[SIZE]; char UartState;//0为接收状态,1为发送状态 uint count;//计数器 //延时器 void DelayMs(uint msec) { uint i,j; for(i=0;i<msec;i++) for(j=0;j<1070;j++); } //初始化串口 void InitUart() { //配置I/O,使用外部设备功能 PERCFG=0x00; //外设控制 P0SEL=0x0C; //配置P0端口的2,3为外设 //配置相应的串口 P2DIR&=~0x40; //优先级的控制 U0CSR|=0x80; //设置为UART模式 //配置串口的波特率 U0GCR=11; U0BAUD=216; U0CSR|=0x40;//接收使能 IEN0|=0x84;//允许USART0 RX 中断使能, 打开所有中断 } //设置发送字符串的函数 void UartSendString(char *Data,uint len) { uint i; for(i=0;i<len;i++) { U0DBUF=*Data++; //传输开始时,触发TX中断,此时为1。 while(UTX0IF==0); //!!!!!!!!!!!!!!!!!?不太懂。 UTX0IF=0; } } //接收中断处理函数 #pragma vector=URX0_VECTOR __interrupt void UART0_ISR() { URX0IF=0;//清中断标志 RxBuf=U0DBUF; } //函数入口 void main() { //首先,设置系统的时钟 CLKCONCMD&=~0x40; //把bit 6置为0,系统时钟选择,为32MHz XOSC while(CLKCONSTA&0x40); //等待晶振稳定 CLKCONCMD&=~0x47; //设置系统时钟频率为32MHZ InitUart(); //初始化端口 memset(RxData,0,SIZE); //数据清零 UartState=0; while(1) { if(UartState==0) //接收状态 { if(RxBuf!=0) { //以“#”为结束符,一次最多接收50个字符 if((RxBuf!='#')&&(count<50)) RxData[count++]=RxBuf;//接收 else { if(count>=50) { memset(RxData,0,SIZE); count=0; } else UartState=1; } RxBuf=0; } //RxBuf=0;//!!!!如果把上面的 RxBuf=0;注释,打开这个的话, //!!!!在串口调试助手中会输出每次都不同的结果,小弟找不到规律。 } if(UartState==1)//发送状态 { //首先要禁止接收 U0CSR&=~0x40; UartSendString(RxData,count); //允许接收字符 U0CSR|=0x40; UartState=0;//回复到接收模式 count=0; memset(RxData,0,SIZE); } } } ``` 谢谢!!!
c#winform编写上位机串口接受到数据如何分开使用
首先已经编写完了上位机接收数据的程序也实现了在textbox控件中实时显示但是传上来的数据是一组xy坐标值我想如何可以在两个textbox控件中分别显示xy也就是把一组数据分开。因为后面还要利用xy值作图。目前我只能把xy一组数据放在一个textbox控件中达到实时更新数据或者使用Split、正则表达式对数据进行分割只能显示第一组分割后的数据但无法实时更新数据。![图片说明](https://img-ask.csdn.net/upload/201705/18/1495096956_858492.png) ![图片说明](https://img-ask.csdn.net/upload/201705/18/1495096701_157934.png)![图片说明](https://img-ask.csdn.net/upload/201705/18/1495097241_53003.png)代码如下: private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] ReceivedData = new byte[sp.BytesToRead];//创建接收字节数组 sp.Read(ReceivedData, 0, ReceivedData.Length);//读取所接收到的数据 receivedDatas.AddRange(ReceivedData); textBox3.Text = (Convert.ToInt32(textBox3.Text) + ReceivedData.Length).ToString(); if (checkBox2.Checked) { textBox1.Text = Class1.ByteTo16Str(receivedDatas.ToArray()); } else { textBox1.Text = Encoding.Default.GetString(receivedDatas.ToArray()); //让文本框获取焦点 string a = Encoding.Default.GetString(receivedDatas.ToArray()); **string[] sArray = a.Split(','); //这里是进行分割数据,去掉这部分直接把a赋值给textbox就会实时显示但是在一个框里显示xy一组数据而不是一个数据x或者y textBox15.Text = sArray[0]; textBox16.Text = sArray[1];** this.textBox15.Focus(); //设置光标的位置到文本尾 this.textBox15.Select(this.textBox1.TextLength, 0); //滚动到控件光标处 this.textBox15.ScrollToCaret(); this.textBox1.Focus(); //设置光标的位置到文本尾 this.textBox1.Select(this.textBox1.TextLength, 0); //滚动到控件光标处 this.textBox1.ScrollToCaret(); } // sp.DiscardInBuffer();//丢弃接收缓冲区数据
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
程序员,职场上请远离这种人!
对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
一个读研让我损失了一百万的真实故事
关注我!只要10分钟,包你学会数据分析 毕业后,应该就业还是考研? 我刚出国留学那会儿,就惊讶的发现,外国local95%都不会选择读研 他们说,硕士学费很贵,时间宝贵,老板不认,所以很费 当几乎所有人都是本科学历时,硕士学历反而像个异类 在老板眼里,三年硕士远远不如3年的工作经验实用 他们甚至专门为拒绝高学历者发明了一个词,叫overoccupie...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
杭漂程序员2019的心路历程,还不起助学贷款,交不起房租,披荆斩棘终雨过天晴
一个杭漂2019的心酸历程,一路披荆斩棘终于还是雨过天晴。
我采访了同事,让他掏出了每天都会浏览的干货网站
前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y在周六的晚上,我日常去到公司写文章。想写...
相关热词 c# 数组类型 泛型约束 c#的赛狗日程序 c# 传递数组 可变参数 c# 生成存储过程 c# list 补集 c#获得所有窗体 c# 当前秒数转成年月日 c#中的枚举 c# 计算校验和 连续随机数不重复c#
立即提问