You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型,直接拼接接收的字符,避免数组索引操作:

  1. 修改变量声明:将char rev[] = new char[15];改为String rev = "";
  2. 重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:50:26