vc串口编程使用mscomm控件的,接受字符个数多余8个时,会重复进中断的OnCommMscomm()的处理对策

基于MFC的串口通信(Mscomm) MFC基于C++的串口通信 阅读详情

在串口编程时,使用microsoft的mscomm控件,简单,实用,特别是对于一些异步处理的场合,使用控件的中断(消息映射),比较方便。

但是,在实际使用中,发现当接收的字符个数大于8个时,会重复进入中断处理函数,这种方式在某些场合使用会出现问题。

本文的目的就是提出一种解决方式,当接受的字符个数大于8个时,在一次中断处理函数中全部接收到这些字符串,而不用多次进入中断处理函数。

 

串口的控件初始化:

m_ComPort.SetCommPort(1);   // 选择串口号

       m_ComPort.SetInBufferSize(1024); //接收缓冲区

       m_ComPort.SetOutBufferSize(1024);//发送缓冲区

       m_ComPort.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取

       m_ComPort.SetInputMode(1);//以二进制方式读写数据

       m_ComPort.SetRThreshold(1);//接收缓冲区有大于等于1个字符时,将引发接收数据的OnCommMscomm事件

       m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数

       if(!m_ComPort.GetPortOpen())   //打开串口

              m_ComPort.SetPortOpen(TRUE);

       else

              m_ComPort.SetOutBufferCount(0);

 

消息映射:

ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射

 

中断(消息)处理函数:

void CSportDlg::OnCommMscomm()  // 串口事件到来

{

       VARIANT variant_inp;

       COleSafeArray safearray_inp;

       LONG len,k;

       BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.

       CString strtemp;   

       switch(m_ComPort.GetCommEvent())

       {

       case 1: // comEvSend发送数据

                     break;

       case 2: // comEvReceive读取数据    串口接收事件到来

     Sleep(50);

                     variant_inp=m_ComPort.GetInput(); //读缓冲区

                     safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量

                     len=safearray_inp.GetOneDimSize(); //得到有效数据长度

                     // 接受数据

                     for(k=0; k<len; k++)

                     {

                            safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组    

                            BYTE bt=*(char*)(rxdata+k); //字符型

                            strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

                            m_receive+=strtemp;                        

                     }

                     break;

       default: // 传输事件出错

                     m_ComPort.SetOutBufferCount(0);

                     break;

             

       }

       UpdateData(FALSE); //更新对话框内容

}

 

注意消息处理函数中的case 2 中的Sleep(50);这一句,这里用了延时再去读取缓冲区的数据m_ComPort.GetInput(); 

这里使用延时的目的就是为了缓冲区接收到更多的字符。

 

这里使用延时时间的长短,根据实际要接受的的数据的多少来灵活设置。

 

使用这种方式可以保证在一次中断处理中,收到到所有的字符,而不会多次进入中断接受字符。

MFC串口通信(二)——使用MSComm控件实现串口通信   由于项目需要,最近在写一个简单的串口通信,基于MFC框架,写完之后特此回顾记录一下学习的过程: 串口通信主体框架 (1) 初始化界面(自动获取全部可用串口) (2) 打开串口 (读取串口号,初始化串口参数(波特率、校验位、数据位等),若串口已经打开则关闭串口) (3) 发送数据 (更新控件状态,进入MSComm事件驱动函数,读缓冲区,数据转换,更新编辑框成员函数,更新编辑框内容) (4) ... 阅读详情

相关推荐

MFC串口通信编程之字符串发送十六进制发送

1.串口通信基础 通信协议:物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输;协议层规定通讯逻辑,统一收发双方的数据打包、解包标准。 串口通讯物理层之RS-232 RS-232标准主要规定了信号用途、通讯接口和信号电平标准。如图9-1为常见的设备间串口通讯结构图。 如上图所示,每个设备都有一个DB9接口,通过DB9接口连接RS-232标准的串口线进行数据传输。由于通...

MAYBE的博客 1万+

VC字符串

Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多种编程方式,不仅功能强大而且应用广泛。在编程中,我们常常会遇到ANSI、Unicode以及BSTR不同编码类 型的字符串转换操作。本文先介绍基本字符串类型,然后说明相关的类,如CComBSTR、_bstr_t、CStringT等,最后讨论它们的转换方法, 其中还包括使用最新ATL7.0的转换类和宏,如CA2CT、

1268

MSComm串口通信-MSComm-控件详解

串口通讯

yygyyygy1233的博客 1702

MFC使用mscomm串口通信

MFC使用mscomm串口通信,有示例

szy的博客 1万+

企业IT运维实录:批量部署银河麒麟V10-SP1,Ghost镜像与UKey激活实战

本文详细介绍了企业级银河麒麟V10-SP1操作系统的批量部署全流程,包括标准化镜像制作、自动化封装技术、网络化部署方案及UKey集群激活方案。通过实战案例和技术要点解析,帮助企业IT运维团队大幅提升部署效率,确保系统安全与稳定性。

weixin_30729609的博客 387

TensorFlow GPU版本安装步骤-Windows系统

本文由在Windows下安装TensorFlow GPU版本教程-优快云等整理得到。 目录 1、确认显卡是否支持CUDA 1.1 查看显卡信息 打开“设备管理器”,查看显卡信息,如下图所示: 由上图知,本电脑的显卡为NVIDIA Quadro P400. 1.2 查看支持CUDA的显卡 网址:https://developer.nvidia.com/cuda-gpus 经查询可知,该显卡支持CUDA,如下图所示: 2、安装CUDA 2.1 下载CUDA 网址:https://developer.nvi

x_lingyun的专栏 765

MSComm 控件

MSComm控件<br /><br />  Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控件后就可以较为方便地实现对通过计算机串口收发数据。<br /><br />  要使用ActiveX控件MSComm,程序员必须将其添加入工程,其方法是:<br /><br />  (1)单击主菜单project的子菜单Add To project的Components

IT人生 1717

【KITTI数据集中Raw_Data数据标定文件中的参数关系解读】

上一节本人将KITTI Odometry数据集中的参数文件进行了解释。本节主要针对一些做融合slam的人,将Raw_Data数据标定文件中的参数按照自己的理解做如下阐述。其中,所讲之处如有错误,欢迎各位批评指正。

weixin_43389152的博客 1526

解决Qt5中的QSerialPort分多次接收串口数据的问题

问题:QSerialPort的readyRead()信号,只要有数据就抛出,这就导致一条数据分多次抛出。由于正常的数据没有固定的开头和结尾,这就导致无法获取正常的一组数据 解决思路:增加接收延时功能,把多次读取的数据保存到缓冲区,延时结束,一次性读取数据

简介 1万+

保姆级教程:用再生龙Clonezilla Live给Ubuntu系统做全盘备份与恢复(含BIOS设置避坑)

本文提供了一份详细的Clonezilla Live教程,指导Ubuntu用户如何轻松完成全盘备份与恢复。从启动盘制作、BIOS设置避坑到备份参数解析和恢复操作,涵盖了所有关键步骤和常见问题解决方案,帮助用户高效保护系统数据。

weixin_42116058的博客 639

【自适应调制】自适应调制解调通信链路误码率matlab仿真与分析

BPSK中的B是“Binary”的意思,也就是有两个变化状态,比如说相位上的“+90°(代表1)、-90°(代表0)”,一个状态代表的就是一个比特。QPSK的“Q”是“Quadrature”的意思,有四个变化状态,如相位上的“+45°(代表00)、-45°(代表11)、+135°(代表10)、-135°(代表01)”,那么一个状态就代表两个比特的信息,如图2所示。同理8PSK的一个状态代表三个比特。但是功率资源并不是无限的,基站总的发射功率是一定的,为了充分利用所有的功率,采用的就是AMC技术。

FPGA/MATLAB学习教程/源码/项目合作开发 1833

MSComm不能触发MSComm1_OnComm()事件原因之一

Me.MSComm1.RThreshold = 0使得OnComm 事件中止.见MSDN解释:当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。 转载于:https://www.cnblogs.com/enjoyprogram/archi...

weixin_30617737的博客 1494

[RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生

有数据的地方就有存储, 内存是谁都离不开的产品。而动态随机存取存储器(DRAM)作为一种常见的内存。本博客将介绍DRAM的基本概念、工作原理、优缺点以及应用领域等方面。

串起点滴 3917

MSComm控件的几个疑难问题汇总

1.VARIANT和SAFEARRAY数据类型是什么鬼? 我们在使用MSComm控件时,在发送与接收数据时都要用到VARIANT数据类型。此外,SAFEARRAY (COLeSafeArray)数据变量也可以用于处理接收到的数据。 VARIANT、_variant_t、COleVariant数据类型 VARIANT及由之而派生的COleVariant类主要用于在OLE自动化中传递数据

沈春旭的博客 4172

廉价却有效?ESD防护中的电容

摘要:在成本敏感型电子产品设计中,多层陶瓷电容(MLCC)可作为TVS二极管的替代方案用于静电放电(ESD)防护。其工作原理是通过电容充放电特性吸收静电能量,而非电压钳位。计算表明100nF/50V MLCC可有效缓冲8kV静电冲击,但存在吸收能量有限、无自恢复等局限。建议将MLCC作为一级缓冲措施,配合TVS等器件形成多级防护,并优先选择X7R材质、100nF容值、50V耐压的0402/0603封装MLCC。该方案在低速信号和电源引脚防护中具有显著成本优势,但不能完全替代专业ESD抑制器。

硬核科技 430

【ArcGIS】07 ArcHydroTools对COM组件的调用返回了错误

在用Arc Hydro Tools提取流域时,在DEM Reconditioning时可能会遇到这个问题: 经过摸索,发现了问题产生的原因: 结果文件保存在了有中文的路径中。 解决的办法: 首先,把ArcGIS切换成英文版 搜索ArcGlS Administrator,以管理员方式打开 点击高级,选择语言为English 其次,新建mxd文档 删除原来的mxd文档,新建mxd文档,放置原来的图层文件。如果不这样做,最后一步的Map Name还会是“图层”这两个汉字。 最后,设置Arc Hydro T

记录专业模型开发、算法程序设计、软件学习笔记、生活日志。 4918

VC6 串口发送接收注意事项

[主要内容] 一、MSComm里用到的VARIANT, COleVariant类型与CString, BYTE之间的转换,以实现数据的发送和接收 二、CString与int的转换,实现对接收来的数据的运算 一、MSComm和VARIANT VC6自带的串口ActiveX MSComm的对象使用SetOutput()和GetInput()方法实现发送和接收。这两个函数的参数都是VAR

phenixyf的专栏 5245

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC6.0中基于MSFlexGrid的可编辑表格

 一、           概述 在我们制作的用户界面中很多时候会用到表格,当然我们首先想到的是用控件,如MSFlexGrid。我们可以方便的调用控件自身的函数来对表格中的元素进行操作,但是如果要设计一个可以编辑的表格,我们该怎么办呢?事实上这种可编辑表格的应用还真的不少,主要是其用户操作的交互性较好。笔者在前一阶段开发项目时遇到了这个问题,以下介绍笔者的实现方案。  

fqli1610的专栏 2522

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

使用MFC过程中遇到的问题以及解决方法(二)

昨天在同事的建议下写了自己的第一篇博客,当然现在想想自己应该感到羞愧才对,学习编程,也有半年多了,正式开始使用编程语言进行工作也有几个月了,到现在都没有养成记录自己遇到的问题和新学到的知识技能.之前的工作中很多时候都会遇到相同的问题,因为自己C语言用得少.

一个小小小菜鸟 2107

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Microsoft Visual C++ 6.0实现串口的通信

摘要:本文介绍了在Microsoft Visual C++ 6.0环境下通过对Active X控件的编程来实现串口的通信的一般方法。  一、 引言  当我们在Windows操作系统下开发串行通信程序时通常不得不面对许多复杂的API函数,因为在Windows操作系统下不能直接对设备端口进行操作,也不能在系统级(Ring 3级别)使用任何DOS或BIOS中断,如要对端口进行编程则只能以文件的形式来对端

挨踢生涯 4147

_variant_t与其他数据类型的转换

转自:http://kuaixingdong.blog.hexun.com/29627840_d.html 我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作和方法; _com_error:定义抛出的error对象; _com_ptr_t:封装COM接口

白永辉的专栏 2万+

MSComm控件相关知识(网上转载)

一、MSComm和VARIANTVC6自带的串口ActiveX MSComm的对象使用SetOutput()和GetInput()方法实现发送和接收。这两个函数的参数都是VARIANT类型。void CMSComm::SetOutput(const VARIANT& newValue)VARIANT CMSComm::GetInput()1. 发送过程:      VARIANT其实是

ysysbaobei的专栏 2976

QT串口接收数据不全

用槽函数接收串口数据,如上,如果一次接收到的数据是256个字符以内就没问题,但超过256就会收不全,这是为什么?

marksu09的专栏 247

MSComm的OnComm事件

直接用JS调用MSComm.ocx老是会出现IE不支持的情况,所以决定做个用户控件,用C#做,然后在IE中调用,为了实现这个想法,遇到一个问题就是OnComm事件不会触发,后来比较下之前JS时设置的参数,需要把RTHreshold设置为1,RTSEnable为True。之后就可以读到数据。但愿明天到客户那里顺利。上帝保佑! 转载于:https://www.cnblogs.com/deng...

weixin_33882443的博客 442
上一篇: Qt在VC6.0下编译出现链接错误
下一篇: Win7+WinDbg+VMware+WinXP调试环境搭建
jiangdf
博客等级 码龄19年 86粉丝 41原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值