Processing代码报错:Type mismatch,char与char[]类型不匹配求解
问题描述
运行一段Processing波长计代码时,第24行和第26行触发类型不匹配错误:
Type mismatch, “char” does not match with “char[]”
完整代码如下:
/*************************************************************************** Created by dbc0301 ***************************************************************************/ import processing.serial.*; Serial port; PFont myFont; int tmp; //int begin='$';//begin int end='\r';//end char rev[] = new char[15];//datas int revFlag=0; int[] data=new int[10];//F1,F2,F3,F4,F5,F6,F7,F8,Clear,NIR //int F1,F2,F3,F4,F5,F6,F7,F8,Clear,NIR; //Stimulus Function float[] Fx={0.07763, 0.34806, 0.09564, 0.02910, 0.51205, 1.02630, 0.64240, 0.04677}; float[] Fy={0.00218, 0.02980, 0.13902, 0.60820, 1.00000, 0.75700, 0.26500, 0.01700}; float[] Fz={0.37130, 1.78260, 0.81295, 0.11170, 0.00575, 0.00110, 0.00005, 0.00000}; int textHight=25; float rt=1;//Length scaling void receiveDatas(){ for(int i=0;port.available()>0;i++){ tmp=port.read(); if(tmp!=end){ rev=char(tmp); }else{ rev=char(tmp); revFlag=1; tmp=port.read(); break; } } } void setup(){ //size(1074,241); size(1250,301); background(0);//white255 black0 noStroke(); myFont = createFont("Microsoft YaHei", 20); textFont(myFont); println(Serial.list()[0]); port = new Serial(this,Serial.list()[0],115200); } void draw(){ receiveDatas(); if(revFlag==1){ String[] m=match(new String(rev), "(.*?):(.*?)\r");//Regular Expression Matching //printArray(m); try{ if(m[1].equals("F1")){ data[0]=int(m[2]); }else if(m[1].equals("F2")){ data[1]=int(m[2]); }else if(m[1].equals("F3")){ data[2]=int(m[2]); }else if(m[1].equals("F4")){ data[3]=int(m[2]); }else if(m[1].equals("F5")){ data[4]=int(m[2]); }else if(m[1].equals("F6")){ data[5]=int(m[2]); }else if(m[1].equals("F7")){ data[6]=int(m[2]); }else if(m[1].equals("F8")){ data[7]=int(m[2]); }else if(m[1].equals("Clear")){ data[8]=int(m[2]); }else if(m[1].equals("NIR")){ data[9]=int(m[2]); }else{ print("Wrong datas!"); } }catch(NullPointerException e){ println(rev); printArray(m); }finally{} revFlag=0; //printArray(data); //delay(10); } /*Display*/ //rectMode(CORNER); background(0); textSize(20); fill(#8b3dc5); rect(0,0,data[0]*rt,30);//F1 text(data[0], data[0]*rt, 0+textHight);//textHeight: veritcal height of text fill(#00528e); rect(0,30,data[1]*rt,30);//F2 text(data[1], data[1]*rt, 30+textHight); fill(#00b1ed); rect(0,60,data[2]*rt,30);//F3 text(data[2], data[2]*rt, 60+textHight); fill(#01ffcd); rect(0,90,data[3]*rt,30);//F4 text(data[3], data[3]*rt, 90+textHight); fill(#00af50); rect(0,120,data[4]*rt,30);//F5 text(data[4], data[4]*rt, 120+textHight); fill(#ffff01); rect(0,150,data[5]*rt,30);//F6 text(data[5], data[5]*rt, 150+textHight); fill(#ffc000); rect(0,180,data[6]*rt,30);//F7 text(data[6], data[6]*rt, 180+textHight); fill(#c10005); rect(0,210,data[7]*rt,30);//F8 text(data[7], data[7]*rt, 210+textHight); fill(#ffffff); rect(0,240,data[8]*rt,30);//Clear text(data[8], data[8]*rt, 240+textHight); fill(#888888); rect(0,270,data[9]*rt,30);//F8 text(data[9], data[9]*rt, 270+textHight); //delay(1); /*Color Temperaure*/ float X,Y,Z,x,y,n,temp; X=(data[0]*Fx[0] + data[1]*Fx[1] + data[2]*Fx[2] + data[3]*Fx[3] + data[4]*Fx[4] + data[5]*Fx[5] + data[6]*Fx[6] + data[7]*Fx[7]);//20/1000;//20 is the interval of integration. 1000 is used to converted the value into a real number between 0~1 Y=(data[0]*Fy[0] + data[1]*Fy[1] + data[2]*Fy[2] + data[3]*Fy[3] + data[4]*Fy[4] + data[5]*Fy[5] + data[6]*Fy[6] + data[7]*Fy[7]);//20/1000;//But it is meaningless to multiply this number here since it will be reduced in the next step Z=(data[0]*Fz[0] + data[1]*Fz[1] + data[2]*Fz[2] + data[3]*Fz[3] + data[4]*Fz[4] + data[5]*Fz[5] + data[6]*Fz[6] + data[7]*Fz[7]);//20/1000; x=X/(X+Y+Z); y=Y/(X+Y+Z); n=(x-0.3320)/(0.1858-y); temp=437*n*n*n+3601*n*n+6831*n+5517; print(temp); println("K\n"); }
错误原因
错误核心是类型不匹配:
rev是char数组(char[]类型),而char(tmp)返回单个char值(char类型)- 直接将单个字符赋值给字符数组,违反类型规则
- 原代码的串口接收逻辑还存在逻辑漏洞:循环变量
i未被用来索引数组,无法正确拼接接收的字符序列
修复方案
方案1:改用String存储串口数据(更简洁可靠)
将字符数组替换为String类型,直接拼接接收的字符,避免数组索引操作:
- 修改变量声明:将
char rev[] = new char[15];改为String rev = ""; - 重写
receiveDatas()函数:
void receiveDatas(){ rev = ""; // 每次接收前清空缓存 while(port.available()>0){ tmp=port.read(); if(tmp!=end){ rev += char(tmp); // 拼接单个字符到字符串 }else{ rev += char(tmp); revFlag=1; break; } } }
方案2:修复char数组的赋值逻辑(保留原数组方式)
如果坚持使用字符数组,需要用索引变量将字符填充到数组对应位置,同时避免越界:
void receiveDatas(){ int i = 0; // 单独声明索引变量,避免循环条件冲突 while(port.available()>0 && i < rev.length-1){ // 限制索引,防止数组越界 tmp=port.read(); if(tmp!=end){ rev[i] = char(tmp); // 将字符存入数组第i位 i++; }else{ rev[i] = char(tmp); i++; rev[i] = '\0'; // 添加字符串结束符,确保转String时正常 revFlag=1; break; } } }
额外优化建议
- 修正拼写错误:
textHight改为textHeight - 增加串口存在性判断,避免空数组索引错误:
if(Serial.list().length > 0){ port = new Serial(this,Serial.list()[0],115200); }else{ println("No serial ports found!"); }
内容的提问来源于stack exchange,提问作者Gianluca Bizzaro
相关产品推荐
相关产品推荐

