串口通信为什么偶尔会丢一个字节? 5C

我用zedboard的板子与PC机通信,用

 xil__printf

打印中文时偶尔会出现乱码,用ascii码进行对照,发现会丢一个字节,而且这个丢字节的位置几乎总是在最后一个中文字的首字节。
我的编码是GBK,通信协议115200, 8, n, 1 (8数据位,无校验位,1停止位)。
各位大侠有什么解法吗?

12个回答

建议使用逻辑分析仪(小的一般就十几二十块钱)采集串口发送的数据,这样分析非常有用,如果确认发送的数据少一个字节,可以排查软件问题。建议尝试使用原始串口发送函数单个字节发送,看是否有这个问题,如果没有,则可能是上层发送字符串函数问题

我以前也出过这问题,是用stm32f103的芯片时发现的,之前是检测的RESET位就出现丢码的问题,后来我把发送代码改成下面的就好了。
for(i = 0; i < 66; i++)
{
USART_SendData(USART1,data[i]);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);
}

u010132497
阿苏尔 回复liubaosen: 不是的,我之前也是有等待的,只不过等待的是RESET标志位,而不是TXE标志位
接近 2 年之前 回复
liubaosen
liubaosen 也就是说添加一个等待就好了?
接近 2 年之前 回复

这个应该是板子底层串口驱动程序问题,丢数据了最后自己数据,可以用示波器看下原因

有干扰吧,驱动也有可能不兼容

可能是数据不一致,可以设置7或8位

双字节和单字节的区别造成的!

liubaosen
liubaosen 有什么区别?有解决方案吗?
接近 2 年之前 回复

看下线是否太长,波特率是否设置正确等

建议你先用 串口调试工具测试板子 是否它自身就有问题。然后在编写你的程序

应该是干扰,可以试试吧波特率降低

使用BusHound串口抓包测试看看是底层硬件发出的数据是否丢包,然后再检查硬件干扰部分

共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MFC用serialport写的串口通信助手,接收的是一个字节?
接收数据的处理函数OnCommunication(WPARAM ch,LPARAM port),WPARAM ch接受的是一个字节吗,如果是,怎么能变成两个字节呢,拜托大神解答下,求代码,急急急
求大神解决,串口通信调试工具发出的一个字节和收回来的字节不一样
电脑与PIC单片机的UART1B收发口通信,电脑串口调试工具发送0x01发回来一个0xc0, 下面是接收中断的程序: void __ISR(_UART_1B_VECTOR, IPL6SOFT) IntUart1BHandler(void) // { if (INTGetFlag(INT_SOURCE_UART_RX(UART1B))) { if (UARTReceivedDataIsAvailable(UART1B)) { RecBuff1b[rec1b_cnt] = U1BRXREG;; U1BTXREG = RecBuff1b[rec1b_cnt ++]; INTClearFlag(INT_SOURCE_UART_RX(UART1B)); } } if (INTGetFlag(INT_SOURCE_UART_TX(UART1B))) { INTClearFlag(INT_SOURCE_UART_TX(UART1B)); } } 运行之后发个01,得了个c0,而且RecBuff1b[0]=0xc0,是不是说明是接收寄存器U1BRXREG接收到的数据有问题,之后的部分是没问题的。 随后我发01 02 03 04 01 02 03 04,得到的是c0 e0 e0 f0 c0 e0 e0 f0。 所以我想知道为什么接收数据不正确呢?
C#中串口通信发送数据问题
串口通信数据发送,除了可用字节数组byte[],还可以用其他的什么吗?
C#中串口通信发送20字节的数据
20字节数据是指160位二进制数吗?转换成整型怎么定义,最大也只有64位?还是指一个一个的数据,总共有20个?
C语言51单片机串口通信程序求教
#include <reg51.h> #include <string.h> #include <intrins.h> #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3; bit read_flag=0; void init_serialcomm(void) { SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80; //SMOD=1; // TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz TH1 = 0xFD; //Baud:19200 fosc=11.0592MHz TL1 = 0xFD; //Baud:19200 fosc=11.0592MHz // IE |= 0x90; //Enable Serial Interrupt ES = 1; //使能串口中断 EA = 1; //打开主中断 TR1 = 1; // timer 1 run // TI=1; } //向串口发送一个字符 void send_char_com(unsigned char ch) { SBUF=ch; while(TI==0); TI=0; } //向串口发送一个字符串,strlen为该字符串长度 void send_string_com(unsigned char *str,unsigned int strlen) { unsigned int k=0; do { send_char_com(*(str + k)); k++; } while(k < strlen); } //串口接收中断函数 void serial () interrupt 4 using 3 { if(RI) { unsigned char ch; RI = 0; ch=SBUF; // count3=0; inbuf1[count3]=ch; count3++; if(count3==(INBUF_LEN)) { read_flag=1; count3=0; } } else if(TI) { TI=0; } } main() { init_serialcomm(); //初始化串口 count3=0; while(1) { if(read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag=0; //取数标志清0 send_string_com(inbuf1,INBUF_LEN); } } } 以上程序代码参考自龚建伟 串口中断接收、发送例程。本意是通过串口发送4个字节数据,单片机串口接收后,发送回4个字节数据(在串口助手显示出来)。 但我通过uvison3下载到stc12c5a60s2最少单片机系统,通过串口测试工具(波特率19200,校验位:无,数据位:8,停止位:1)发送数据为:ff ff ff ff (十六进制发),十六进制收,结果为发送4字节,接收2字节,串口助手接收到显示为77 ff, 程序不知道是哪里出错了,求正解。 我自己分析如下: 发送4字节,只接收到2字节?首先怀疑是串口初始化问题,但查不出。再看缓存的4字节数据,也提供了足够的空间,处理上也看不出问题。哪位高手指点下。非常感谢!!!
VB串口通信数据丢包问题,求大神帮忙!急急急!
部分程序如下: Dim DataBuf As String Dim Buf As String Dim GetCRC As String Dim SlaveDataTemp As String Dim Pic_flag As Boolean With MSComm1 Select Case MSComm1.CommEvent '判断MSComm1通信事件 Case comEvReceive '收到Rthreshold个字节产生的接收事件 Buf = .Input If InStr(1, Buf, "!") < 1 Then ‘判断从第一个起数据里的!<1,把数据打包起来 TempData = TempData & Buf Exit Sub End If Address = Mid(TempData, 2, 2) 'Mid截取字符串的长度!从机地址 FunctionCode = Mid(TempData, 4, 2) ‘功能码 Pic_flag = False If FunctionCode = "wr" Then TextReceive.Text = TextReceive.Text & Trim(TempData) & Chr(13) & Chr(10) End If 这个是功能码是wr时,把接收到的数据显示出来,为什么我的丢包特别严重呢?是不是应该加个什么判断语句啊?我的结束未是! 求大神帮忙,很急很急!
试编写一串行通信的数据发送程序
试编写一串行通信的数据发送程序,发送片内RAM的20H~2FH单元的16字节数据,串行接口方式设定为方式2,采用偶校验方式。设晶振频率为6MHz。
安卓和stc单片机串口通信的问题
我用安卓usbserial开源软件及pl2302通过串口连接单片机,收发时发现一个问题,如果安卓端发送一串字节数组 比如0x00,0x01,0X02.单片机部分就是一个简单的接收并原样发送的程序代码。现在有出现一个问题安卓端接收时第一个字节总是缺失,只接收到0x01,0x02.这是怎么回事?
串口通信数据传输数据丢失
我现在要做一个全站仪的数据读取接口,由于不了解全站仪数据的发送方式,缓冲区大小该如何设置,才不会造成数据丢失? 比如我设置缓冲区大小为1024,我一次性发送2048个字节的数据,那么缓冲区只有1024个字节的数据,剩下的1024个字节数据那里去了?有什么别的传输方式可以避免这样的问题嘛?
java实现串口通信报错,求大神帮忙
我准备实现从串口接收数据(要求接收的数据长时间持续传输,且传输较快),将得到的数据实时的显示在多个已经定义好的JFreechart中,现已定义一个JFreechart的数组,目前设计的是接收一组5个字节的数据,每接收五个字节,就把这五个数字显示在一个chart中,从chart1到chart7,一直循环,代码如下 ``` package com.control; import gnu.io.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.Enumeration; import java.util.TooManyListenersException; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import com.view.dataplay; import com.view.JFSwingDynamicChart; import javax.swing.*; public class ContinueRead extends Thread implements SerialPortEventListener { // SerialPortEventListener // 监听器,我的理解是独立开辟一个线程监听串口数据 static CommPortIdentifier portId; // 串口通信管理类 static Enumeration<?> portList; // 有效连接上的端口的枚举 InputStream inputStream; // 从串口来的输入流 static OutputStream outputStream;// 向串口输出的流 JFSwingDynamicChart Jchart[]; byte[] readBuffer; JFrame frame; int numBytes = -1; double b[]; // static SerialPort serialPort; // 串口的引用 // 堵塞队列用来存放读到的数据 private BlockingQueue<String> msgQueue = new LinkedBlockingQueue<String>(); int time = 0; //做测试 设置time为0-7 之中 随机输出数字 @Override /** * SerialPort EventListene 的方法,持续监听端口上是否有数据流 */ public void serialEvent(SerialPortEvent event) {// switch (event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据 readBuffer = new byte[20]; try { numBytes = -1; b =new double[20]; while (inputStream.available() > 0) { numBytes = inputStream.read(readBuffer); if(numBytes>0) { //输出得到的数据 //System.out.println(numBytes); for(int i=0;i<numBytes;i++) { b[i] = (double)(readBuffer[i] -= 48); System.out.println((double) (readBuffer[i])); //转换成double } /* * ceshi * */ //传到JSchart中 (new Thread(this)).start(); /* frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent windowevent) { System.exit(0); } });*/ time++; time=time%8; /* * * */ readBuffer = new byte[20]; } /* if (numBytes > 0) { msgQueue.add(new Date() + "真实收到的数据为:-----" + new String(readBuffer)); readBuffer = new byte[20];// 重新构造缓冲对象,否则有可能会影响接下来接收的数据 } else { msgQueue.add("额------没有读到数据"); }*/ } } catch (IOException e) { } break; } } /** * * 通过程序打开COM4串口,设置监听器以及相关的参数 * * @return 返回1 表示端口打开成功,返回 0表示端口打开失败 */ public int startComPort() { // 通过串口通信管理类获得当前连接上的串口列表 portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { // 获取相应串口对象 portId = (CommPortIdentifier) portList.nextElement(); System.out.println("设备类型:--->" + portId.getPortType()); System.out.println("设备名称:---->" + portId.getName()); // System.out.println("12"); // 判断端口类型是否为串口 if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { // 判断如果COM4串口存在,就打开该串口 if (portId.getName().equals("COM4")) { try { // 打开串口名字为COM_4(名字任意),延迟为2毫秒 serialPort = (SerialPort) portId.open("COM_4", 2000); } catch (PortInUseException e) { e.printStackTrace(); return 0; } // 设置当前串口的输入输出流 try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { e.printStackTrace(); return 0; } // 给当前串口添加一个监听器 try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { e.printStackTrace(); return 0; } // 设置监听器生效,即:当有数据时通知 serialPort.notifyOnDataAvailable(true); // 设置串口的一些读写参数 try { // 比特率、数据位、停止位、奇偶校验位 serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); return 0; } return 1; } } } return 0; } @Override public void run() { // TODO Auto-generated method stub /*try { System.out.println("--------------任务处理线程运行了--------------"); while (true) { // 如果堵塞队列中存在数据就将其输出 if (msgQueue.size() > 0) { System.out.println(msgQueue.take()); } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ for(int i=0;i<numBytes;i++) try { Jchart[time].setNumber(b[i]); Thread.sleep(1); } catch (InterruptedException e) { } } /* * 串口配置初始化 * */ public void init(){ startComPort(); } /* public static void main(String[] args) { ContinueRead cRead = new ContinueRead(); int i = cRead.startComPort(); if (i == 1) { // 启动线程来处理收到的数据 cRead.start(); try { String st = "哈哈----你好"; System.out.println("发出字节数:" + st.getBytes("gbk").length); outputStream.write(st.getBytes("gbk"), 0, st.getBytes("gbk").length); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { return; } }*/ public void setJchart(JFSwingDynamicChart[] j){ Jchart = j; } public void setFrame(JFrame f){ frame = f; } } ``` 运行的时候出现报错 Exception in thread "Thread-22" java.lang.NullPointerException at java.util.Collections.indexedBinarySearch(Collections.java:226) at java.util.Collections.binarySearch(Collections.java:213) at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:916) at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:887) at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:871) at com.view.JFSwingDynamicChart.setNumber(JFSwingDynamicChart.java:135) at com.control.ContinueRead.run(ContinueRead.java:184) at java.lang.Thread.run(Thread.java:745) 求大神解答!
C++串口通信writefile()后为什么要Sleep,readfile()才能读取到数据?
各位朋友大家好,有一个项目需要用C++实现串口通信(采用同步方式因为需要轮询下位机)并将串口的数据通过socket发送给服务器,现在基本功能已经实现,还存在一个小bug。当上位机用writefile函数向下位机写数据时,需要在writefile后Sleep(75),接收readfile时才能读取到数据,不加延时数据则为空。我的readfile函数是单独开了一个级别高的线程来完成的。writefile和线程的代码如下,各位帮忙提提意见 ``` // 向串口写数据, 将缓冲区中的数据写入到串口 bool CSerialPort::WriteData(unsigned char *pData, int length) { int *pData1=new int; BOOL bResult = TRUE; DWORD BytesToSend = 0; if (m_hComm == INVALID_HANDLE_VALUE) { return false; } /** 临界区保护 */ EnterCriticalSection(&m_csCommunicationSync); /** 向缓冲区写入指定量的数据 */ bResult = WriteFile(m_hComm,/*文件句柄*/pData,/*用于保存读入数据的一个缓冲区*/ 9,/*要读入的字符数*/ &BytesToSend,/*指向实际读取字节数的指针*/ NULL); if (!bResult) { DWORD dwError = GetLastError(); /** 清空串口缓冲区 */ PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_RXABORT); LeaveCriticalSection(&m_csCommunicationSync); return false; } /** 离开临界区 */ LeaveCriticalSection(&m_csCommunicationSync); Sleep(75); return true; } ``` //串口监听线程 UINT WINAPI CSerialPort::ListenThread(void* pParam) { /** 得到本类的指针 */ CSerialPort *pSerialPort = reinterpret_cast<CSerialPort*>(pParam); // 线程循环,轮询方式读取串口数据 while (!pSerialPort->s_bExit) { UINT BytesInQue = pSerialPort->GetBytesInCOM(); /** 如果串口输入缓冲区中无数据,则休息一会再查询 */ for(int time=1;time<=3;time++){ if ((BytesInQue == 0)) { Sleep(SLEEP_TIME_INTERVAL); continue; } } /** 读取输入缓冲区中的数据并输出显示 */ //unsigned char cRecved = 0x00; unsigned char cRecved ; do { cRecved =0x00; if (pSerialPort->ReadChar(cRecved) == true) { // 定义字符串流,将后面的字符串按照对象存入到ss中并以空格键结束 std::stringstream ss; int tm = cRecved; // std::hex表示16进制输出流,即后面输出的为16进制的形式,setw(2)以两个字符的形式输出,setfill(0)不够两个字符的用0填充。 ss << std::hex << std::setw(2) << std::setfill('0') << tm; //减少传输数据大小,字符间不需空格 //ss << " "; // 转换成大写 string a = ss.str(); //string b; //transform(a.begin(), a.end(), back_inserter(b), ::toupper); // 显示占用时间,引起错误 //cout << b ; // 拼接传递给server recdata += a; continue; } } while (--BytesInQue); // 循环结束产生信号 setClientUploadEvents(); } return 0; } ``` //读取串口接收缓冲区中一个字节的数据 bool CSerialPort::ReadChar(unsigned char &cRecved) { BOOL bResult = TRUE; DWORD BytesRead = 0; DWORD Bytesnum = GetBytesInCOM(); if (m_hComm == INVALID_HANDLE_VALUE) { return false; } /** 临界区保护 */ EnterCriticalSection(&m_csCommunicationSync); /** 从缓冲区读取一个字节的数据 */ bResult = ReadFile(m_hComm, &cRecved, 1, &BytesRead, NULL); if ((!bResult)) { /** 获取错误码,可以根据该错误码查出错误原因 */ DWORD dwError = GetLastError(); /** 清空串口缓冲区 */ PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_RXABORT); LeaveCriticalSection(&m_csCommunicationSync); return false; } /** 离开临界区 */ LeaveCriticalSection(&m_csCommunicationSync); return (BytesRead == 1); } ``` 主函数代码: cout << mySerialPort.WriteData(temp, 9) << endl; WaitForSingleObject(hEvent, INFINITE); // 有信号执行下面语句 cout << 12345 << endl; mySerialPort.socketsend(recdata,1,sclient); recdata = "";
Android蓝牙与带有蓝牙模块的单片机的通信问题
我在app里面设置了每次传输一个字节,好比我要传输“1”吧,那它这个“1”是怎么表示的呢?就好比pic里面的单片机吧,“1”就用0000,0001来表示,再有蓝牙串口通信与一般的蓝牙通信在app 里面编程是一会回事吗?串口通信不是要设置波特率什么的吗,这个需要吗?app里面怎么设置呢?
蓝牙串口通信时,接收串口数据被截断。
比如返回值是123456 但总是分段发给我 1 , 22, 456, 不确定分几段 发来。求解决啊 我被搞死了 while(true) { try { //如果读取的字节数大于0,表示有数据存在 bytes = inStream.read(buffer); if(bytes > 0) { //定义新的字符数据,长度为读取的数据的长度 byte[] byte_data = new byte[bytes]; //通过循环将buffer里面的数据复制到byte_data数组中 for(int i=0; i<bytes; i++) { byte_data[i] = buffer[i]; } //将byte_data数组转换成字符串 String sda = new String(byte_data); System.out.println("收到的数据sda为:"+sda); } }catch(IOException a) { try { inStream.close(); } catch(IOException ae) { ae.printStackTrace(); }
求问串口通信协议应该怎么看懂,我应该怎么发送数据?
![图片说明](https://img-ask.csdn.net/upload/201803/07/1520387041_588581.jpg) ![图片说明](https://img-ask.csdn.net/upload/201803/07/1520387058_682231.png) ![图片说明](https://img-ask.csdn.net/upload/201803/07/1520386943_148395.png) 我的困惑在前面通信协议说数据是8位的,但是数据长度又是20个字节,那我应该怎么发送我的数据。 我发送char send_buf[20]={0x01,0x23,0x02,0x05,0x02,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0xFE}; 就会报警,串口上传提示错误是心跳超时。 我发送char send_buf[20]={0x01,0x23,0x01,0x0A,0x01,0x0A,0x00,0x00,0x00,0x00,0x16,0xFE}; 接受以后就没有反应,电机也不转动。 不发送任何数据时,串口接收到的数据是:81 ff 19 00 08 00 00 00 00 00 01 00 00 00 00 00 19 00 3a 7e 是这样20位的。我应该怎么发送数据控制电机呢?求大神能够给我讲解一下我错在哪里或给我举个例子
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数组的原因是什么?怎样修改可以避免这个问题? 求高人指点,小弟感激不尽!
VB.NET中如何处理串口通信接收的数据?
现在上位机的代码如下: Private Sub comm_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Dim n As Integer = comm.BytesToRead Dim buf(n) As Byte comm.Read(buf, 0, n) builder.Length = 0 Invoke(Sub() If checkBoxHexView.Checked Then For Each b As Byte In buf builder.Append(b.ToString("X2") & " ") Next Else builder.Append(Encoding.ASCII.GetString(buf)) End If txGet.AppendText(builder.ToString) End Sub) End Sub 下位机传输的数据大体是: 100 101 102 103 104 全是三位数的数字,但是直接想在上位机中转换为数值就出现了问题。 比如我重新做一个textbox, textbox2.text=builder.tostring 显示的值就是单字节数值,怎样读出下位机输出的一行,并且转换为数值型? PS:下位机可做改动,可以增加识别字符。 小的再此感谢各位大神!
STM32串口通信,串口调试助手中可以实现收发,自己编的串口助手就只能收不能发,有大神知道怎么办吗?
如题,最近做一个这样的调试,用32的开发板向电脑发送数据,用普通的串口调试助手就可以正常收发。 实际如下:32设备收到发来的信号,然后再将另外一组数据发送到调试助手 ![图片说明](https://img-ask.csdn.net/upload/201810/23/1540282792_7501.png) 然后在普通的串口调试助手上就是这样的; 我自己根据博客上的代码写了个差不多的串口工具,用的是Communications control ,version6.0这个控件写的。 但是结果上来说,如果32定时自己向这个工具发数据的话是可以发的,工具也能收到并且显示出来,但是用这个工具向32发数据32却收不到。 因此我又用了虚拟串口,用电脑上的串口调试助手和我写的工具互相收发,双方也都是能收到数据,也能互相发送数据,请大神帮我看看到底是那里出了问题! 串口工具收到32的数据: ![图片说明](https://img-ask.csdn.net/upload/201810/23/1540283320_110440.png) 但是这个串口工具向32发送时32却收不到数据。 为了验证串口可以发送,我用了虚拟串口,如下: ![图片说明](https://img-ask.csdn.net/upload/201810/23/1540283543_713052.png) STM32的程序如下: void UART1_Send_Array() // { unsigned char i=0; // unsigned char t=0; // num=8; for(i=0;i<num;i++) { USART_SendData(USART1,send_array[t]); // while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);// t++; } } if(USART_RX_STA&0x8000) { UART1_Send_Array(); USART_RX_STA=0; LED0=!LED0; } 以及初始化等 #if EN_USART1_RX //Èç¹ûʹÄÜÁ˽ÓÊÕ //´®¿Ú1ÖжϷþÎñ³ÌÐò //×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó u8 USART_RX_BUF[USART_REC_LEN]; //½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú. //½ÓÊÕ״̬ //bit15£¬ ½ÓÊÕÍê³É±êÖ¾ //bit14£¬ ½ÓÊÕµ½0x0d //bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿ u16 USART_RX_STA=0; //½ÓÊÕ״̬±ê¼Ç void uart_init(u32 bound){ //GPIO¶Ë¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜUSART1£¬GPIOAʱÖÓ //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.9 //USART1_RX GPIOA.10³õʼ»¯ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.10 //Usart1 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ //USART ³õʼ»¯ÉèÖà USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ 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(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖÐ¶Ï USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú1 } void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò { u8 Res; #if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ) { Res =USART_ReceiveData(USART1); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É { if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d { if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼ else USART_RX_STA|=0x8000; //½ÓÊÕÍê³ÉÁË } else //»¹Ã»ÊÕµ½0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ } } } } #if SYSTEM_SUPPORT_OS //Èç¹ûSYSTEM_SUPPORT_OSΪÕ棬ÔòÐèÒªÖ§³ÖOS. OSIntExit(); #endif } #endif 主要就是设置GPIO口,设置波特率等等 VS2010的主要程序如下: void CSerialTestDlg::OnCbnSelchangeComboCom() { // TODO: 在此添加控件通知处理程序代码 int nSel; nSel = m_comboCom.GetCurSel();//获取组合框控件的列表框中选中项的索引 m_ctrlComm.put_CommPort(nSel+1);//选择串口号(这里因为列表框的索引号是从0开始,所以(nSel+1)对应的才是我们所选的串口号) m_ctrlComm.put_PortOpen(TRUE);//打开串口 m_ctrlComm.put_RThreshold(2);//收到两个字节引发OnComm事件 m_ctrlComm.put_InputMode(1);//输入模式选为二进制 m_ctrlComm.put_Settings(_T("9600,n,8,1"));//设置串口参数,波特率,无奇偶校验,位停止位,位数据位 m_ctrlComm.put_InputMode(1); // 以二进制方式检取数据 m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0 m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据 m_setOk = true; //标记串口设置OK } BEGIN_EVENTSINK_MAP(CSerialTestDlg, CDialogEx) ON_EVENT(CSerialTestDlg, IDC_MSCOMM1, 1, CSerialTestDlg::OnComm, VTS_NONE) END_EVENTSINK_MAP() void CSerialTestDlg::OnComm() { // TODO: 在此处添加消息处理程序代码 VARIANT variant_inp; //Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。 COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integer that is not signed. CString strtemp; if(m_ctrlComm.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.get_Input(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k);//字符型 strtemp.Format(_T("%x"),bt); //8位数组显示,就是现在strtemp中是51 00 00 00 0 m_strRXData+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容 } void CSerialTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 if (m_setOk == true) //判断是否打开并初始化串口 { UpdateData(TRUE); //读取编辑框内容 m_ctrlComm.put_Output(COleVariant(m_strTXData)); //发送数据 } else { MessageBox(_T("请先选择COM口")); } } void CSerialTestDlg::OnBnClickedButtonCleanup() { // TODO: 在此添加控件通知处理程序代码 m_strRXData=""; UpdateData(FALSE);//更新编辑框内容 } 请求大神帮我看一下大概是哪里出现了问题!
问下大神定时器T0中断导致串口通信无法正常进行的问题。
这是我的代码,将之烧入51单片机时,串口通信本来是让led显示,但是可能由于红外遥控的中断函数干扰了串口通信,导致红外遥控工作正常,串口通信无法进行,led无法显示。 #include<reg51.h> #include<intrins.h> #include"lcd.h" #include"temp.h" #define uint unsigned int #define uchar unsigned char sbit moto=P1^0; uchar CNCHAR[6] = "摄氏度"; void LcdDisplay(int); void UsartConfiguration(); /******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void UsartConfiguration() { SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; //ES=1; //打开接收中断 //EA=1; //打开总中断 TR1=1; //打开计数器 } uchar time0; bit IRok;//33数据位处理完成标志位 bit handle_ok; uchar IRcode[4];//4个字节 uchar IRdata[33];//33位数据 void InitUART() //定时器初始化 { TMOD=0x02;//定时器重装初值 TH0=0; TL0=0; EA=1; EX0=1; TCON=0X01; ET0=1; TR0=1;//启动定时器 } void t0() interrupt 1 { time0++;//一次中断为277.76us } void int0() interrupt 0 { static uchar i; static bit flag; if(flag) { ES=0; if((time0<54)&&(time0>32)) i=0; IRdata[i]=time0; time0=0; i++; if(i==33) { i=0; IRok=1; } } else { time0=0; flag=1; } } void handle_data() { uchar i;//处理四个字节 uchar j;//处理八位 uchar k;//处理三十三个数据 k=1; for(i=0;i<4;i++) { for(j=0;j<8;j++) { if(IRdata[k]>5) IRcode[i]|=0x80; k++; if(j<7) IRcode[i]>>=1; } } handle_ok=1; } void work() { uchar j; j=0x01; switch (IRcode[2]) { case 0x0c:moto=0;break;//1 数字一按键停止(修改这里更改控制按键) case 0x18:moto=1;break;//2数字二按键启动 default:break; } } but() { while(1) { if(IRok) { handle_data(); IRok=0; } if(handle_ok)//如果处理完成处理遥控器相关程序 { work(); handle_ok=0; } } } void main() { InitUART(); UsartConfiguration(); LcdInit(); //初始化LCD1602 LcdWriteCom(0x88); //写地址 80表示初始地址 LcdWriteData('C'); while(1) { but(); LcdDisplay(Ds18b20ReadTemp()); } } /******************************************************************************* * 函数名 : LcdDisplay() * 函数功能 : LCD显示读取到的温度 * 输入 : v * 输出 : 无 *******************************************************************************/ void LcdDisplay(int temp) //lcd显示 { unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组 float tp; if(temp< 0) //当温度值为负数 { LcdWriteCom(0x80); //写地址 80表示初始地址 SBUF='-';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 LcdWriteData('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('+'); //显示正 SBUF='+';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } if(temp>=2900) { moto=1; //开启电机 } else { moto=0; //关闭电机 } datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; LcdWriteCom(0x82); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]); //百位 SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器 while (!TI) ; //等待发送数据完成 TI = 0; LcdWriteCom(0x83); //写地址 80表示初始地址 LcdWriteData('0'+datas[1]); //十位 SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x84); //写地址 80表示初始地址 LcdWriteData('0'+datas[2]); //个位 SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x85); //写地址 80表示初始地址 LcdWriteData('.'); //显示 ‘.’ SBUF = '.';//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x86); //写地址 80表示初始地址 LcdWriteData('0'+datas[3]); //显示小数点 SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; LcdWriteCom(0x87); //写地址 80表示初始地址 LcdWriteData('0'+datas[4]); //显示小数点 SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; for(i=0; i<6; i++) { SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; } }
c++串口通信问题吗,返回的是cccccc......,附上源码,新手求助!!!
#include "stdafx.h" #include <Windows.h> #include<iostream> using namespace std; HANDLE InitCOM(LPCTSTR Port) { HANDLE hCom = INVALID_HANDLE_VALUE; hCom = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0/*同步方式打开串口*/, NULL); if (INVALID_HANDLE_VALUE == hCom) { return INVALID_HANDLE_VALUE; } SetupComm(hCom, 4096, 4096);//设置缓存 DCB dcb; GetCommState(hCom, &dcb);//设置串口 dcb.DCBlength = sizeof(dcb); dcb.BaudRate = CBR_9600; dcb.StopBits = ONESTOPBIT; SetCommState(hCom, &dcb); PurgeComm(hCom, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);//清空缓存 COMMTIMEOUTS ct; //设置读取超时时间,及ReadFlie最长等待时间 ct.ReadIntervalTimeout = 0; ct.ReadTotalTimeoutConstant = 5000; ct.ReadTotalTimeoutMultiplier = 500; ct.WriteTotalTimeoutMultiplier = 500; ct.WriteTotalTimeoutConstant = 5000; SetCommTimeouts(hCom, &ct);//设置超时 return hCom; } bool ComRead(HANDLE hCom, LPBYTE buf, int &len) { DWORD ReadSize = 0; //是无符号的, 相当于unsigned long BOOL rtn = FALSE; //设置读取1个字节数据,当缓存中有数据到达时则会立即返回,否则直到超时 rtn = ReadFile(hCom, buf, 1, &ReadSize, NULL); //如果是超时rtn=true但是ReadSize=0,如果有数据到达,会读取一个字节ReadSize=1 if (rtn == TRUE && 1 == ReadSize) { DWORD Error; COMSTAT cs = { 0 }; int ReadLen = 0; //查询剩余多少字节未读取,存储于cs.cbInQue中 ClearCommError(hCom, &Error, &cs); ReadLen = (cs.cbInQue > len) ? len : cs.cbInQue; if (ReadLen > 0) { //由于之前等待时以读取一个字节,所欲buf+1 rtn = ReadFile(hCom, buf + 1, ReadLen, &ReadSize, NULL); len = 0; if (rtn) { len = ReadLen + 1; } } } PurgeComm(hCom, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT); return rtn != FALSE; } bool ComWrite(HANDLE hCom, LPBYTE buf, int &len) { PurgeComm(hCom, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT); BOOL rtn = FALSE; DWORD WriteSize = 0; rtn = WriteFile(hCom, buf, len, &WriteSize, NULL); len = WriteSize; return rtn != FALSE; } int main() { HANDLE hCom = InitCOM("COM4"); string str = "0a010100000a"; unsigned char b[216]; unsigned char a[6] = { 0xa5,1,1,0,0,0x0a }; //LPBYTE buf; //m_cs.Lock();//每一个操作前先锁定设备 int len = 6; int rlen = 216; bool issend = ComWrite(hCom, a, len); if (issend) { printf("发送成功!\n"); } Sleep(3*1000); bool isread = ComRead(hCom,b,rlen); if (isread) { printf("接收成功!\n"); } for (int i = 0; i < 216; i++) { printf("%x",b[i]); } system("pause"); }
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 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...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 另外推荐一篇原创:终极推荐!可能是最适合你的Java学习路线 方法 网站 书籍推荐! Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
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)需要把备份的数据同步到远程备份中心,假如...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
神经⽹络可以计算任何函数的可视化证明
《Neural Networks and Deep Learning》读书笔记第四篇本章其实和前面章节的关联性不大,所以大可将本章作为小短文来阅读,当然基本的深度学习基础还是要有的。主要介绍了神经⽹络拥有的⼀种普遍性,比如说不管目标函数是怎样的,神经网络总是能够对任何可能的输入,其值(或者说近似值)是网络的输出,哪怕是多输入和多输出也是如此,我们大可直接得出一个结论:不论我们想要计算什么样的函数,...
聊聊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 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
活到老,学到老,程序员也该如此
全文共2763字,预计学习时长8分钟 图片来源:Pixabay 此前,“网传阿里巴巴要求尽快实现P8全员35周岁以内”的消息闹得沸沸扬扬。虽然很快被阿里辟谣,但苍蝇不叮无缝的蛋,无蜜不招彩蝶蜂。消息从何而来?真相究竟怎样?我们无从而知。我们只知道一个事实:不知从何时开始,程序猿也被划在了“吃青春饭”行业之列。 饱受“996ICU”摧残后,好不容易“头秃了变强了”,即将步入为“高...
Vue快速实现通用表单验证
本文开篇第一句话,想引用鲁迅先生《祝福》里的一句话,那便是:“我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单”。这句话要从哪里说起呢?大概要从最近半个月的“全栈工程师”说起。项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载。博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用...
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...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问